Magento 2.3: Как реализовать декларативную схему в пользовательском модуле

14

Я устанавливаю magento 2.3 и создаю собственный модуль.

Но я не знаю, как создать собственную таблицу базы данных в версии magento 2.3.

суровый кхандхар
источник
2
база данных или пользовательская таблица в базе данных Magento?
Паван
1
Здесь вы можете больше
узнать о

Ответы:

39

Прежде всего, создайте db_schema.xmlфайл внутри /RH/Helloworld/etcи напишите следующий код:

<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="rh_helloworld" resource="default" engine="innodb" comment="RH Helloworld">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="ID"/>
        <column xsi:type="varchar" name="author_name" nullable="false" length="25" comment="Name"/>
        <column xsi:type="varchar" name="email" nullable="false" length="25" comment="Email"/>
        <column xsi:type="varchar" name="description" nullable="false" length="255" comment="Descrition"/>
        <constraint xsi:type="primary" referenceId="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>
</schema>
  • <table> .. </table> = "Использовать для создания и установки имени таблицы"
  • <column> .. </column> = "Использовать для создания и установки столбца таблицы"
  • <constraint> .. </constraint> = "Использовать для установки ограничения как первичный ключ, внешний ключ, уникальный ключ и т. Д."

Перед запуском команды обновления вам нужно добавить схему в db_whitelist_schema.jsonфайл, выполнив следующую команду:

php bin/magento setup:db-declaration:generate-whitelist --module-name=RH_Helloworld

Теперь db_whitelist_schema.jsonв /RH/Helloworld/etcпапке будет создан файл .

Теперь беги php bin/magento s:up

Таблица будет создана внутри базы данных.

=> Если вы хотите переименовать столбец, вам нужно установить следующую строку в db_schema.xmlсоответствующем столбце:

<column xsi:type="varchar" name="customer_email" onCreate="migrateDataFrom(email)" on_update="false" nullable="false" default="" comment="Customer Email"/>

здесь name = "имя нового столбца" и onCreate = "migrateDataFrom ()" = "имя старого столбца"

=> Если вы хотите удалить таблицу, то вы можете удалить весь узел таблицы из файла XML или установить для атрибута disabled атрибут true, как показано в строке ниже db_schema.xml:

<table name="rh_helloworld" resource="default" engine="innodb" comment="RH Helloworld" disabled="true">
 ..
 </table>

Для более подробной информации, вы можете проверить здесь .

Надеюсь, это будет полезно для вас.

Рохан Хапани
источник
1
Хороший @Rohan
Рамкишан Сутар
Хорошее объяснение ..... Большое спасибо .... Это действительно полезно ....
суровый кхандхар
Рад был помочь !! Удачного кодирования :) & Спасибо @RamkishanSuthar
Рохан Хапани
Почему нам нужно сгенерировать db_whitelist_schema.json?
Раманатан
@RohanHapani Как я могу создать собственный атрибут продукта в Magento 2.3.0, используя собственное расширение?
Кишан Патадия
12

Создайте файл с именем db_schema.xml в папке etc в любом пользовательском модуле.

<?xml version="1.0" encoding="UTF-8"?>

<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="books_data" resource="default" engine="innodb" comment="Book Table">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="BOOK ID"/>
        <column xsi:type="varchar" name="book_name" nullable="false" length="255" comment="Book Name"/>
        <column xsi:type="int" name="author" unsigned="true" nullable="true" identity="false" default="" comment="Author"/>
        <column xsi:type="varchar" name="isbn_no" nullable="true" comment="ISBN No"/>
        <column xsi:type="timestamp" name="publish_date" on_update="false" nullable="false" default="CURRENT_TIMESTAMP"
                comment="Publish Date"/>
      <column xsi:type="varchar" name="language" nullable="true" comment="Language"/>
         <column xsi:type="decimal" name="mrp" scale="4" precision="12" unsigned="false" nullable="false"
                default="0" comment="MRP"/>
        <constraint xsi:type="primary" name="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>

    <table name="author_data" resource="default" engine="innodb" comment="Author Table">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="Author ID"/>
        <column xsi:type="varchar" name="author_name" nullable="false" length="255" comment="Author Name"/>
        <column xsi:type="varchar" name="author_email" nullable="false" length="255" comment="Author Email"/>
        <column xsi:type="varchar" name="affliation" nullable="false" length="255" comment="Affliation"/>
        <column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age"/>
        <constraint xsi:type="primary" name="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>
</schema>

Теперь создайте db_whitelist_schema.json по тому же пути

php bin/magento setup:db-declaration:generate-whitelist --module-name=Vendor_Module

После этого просто запустите php bin / magento setup: upgrade . Для получения дополнительной информации вы можете проверить здесь . Дайте мне знать, если вам нужно больше объяснений по этому поводу.

Рамкишан Сутар
источник
Но ... это тот же ответ, что и выше. Почему двойной пост?
Jisse Reitsma
@JisseReitsma Я отправил перед ответом выше. проверьте время обоих ответов.
Рамкишан Сутар
Мое плохое: вы оба ответили на вопрос в течение 14 минут после того, как оригинальное сообщение было сделано, и вы были немного быстрее. Кажется , что вы , ребята делают это спорт , чтобы ответить на новый вопрос как можно скорее :)
Jisse Reitsma
1
Ответ идеален. Я хочу добавить больше информации: главный недостаток старого подхода (InstallSchema) заключается в том, что Magento применяет изменения вслепую. Например, в одной версии может быть введен новый столбец базы данных, который будет удален только в следующей. Декларативная настройка устраняет этот тип ненужной работы.
Хафиз Умер
0

В основных модулях Magento 2.3 вместо сценария обновления установки используется подход декларативной схемы. Это новый рекомендуемый подход в Magento 2.3 и выше. Magento 2.3.x по-прежнему работает с InstallSchema, InstallData и т. Д.

Марк Генри
источник