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


14

Встановлюю magento 2.3 і створюю спеціальний модуль.

Але я не знаю, як створити власну таблицю бази даних у версії magento 2.3.


2
база даних або спеціальна таблиця в базі даних Magento?
Pawan

Відповіді:


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 або ви можете встановити відключений атрибут на true як у нижньому рядку у вашому db_schema.xml:

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

Більш детальну інформацію ви можете перевірити тут .

Сподіваюся, це вам допоможе.


1
Хороший @Rohan
Ramkishan Suthar

Приємне пояснення ..... Дякую тобі .... Це дуже корисно ....
суворий хандхар

Раді допомогти !! Щасливе кодування :) & Дякую @RamkishanSuthar
Rohan Hapani

Чому нам потрібно генерувати 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 хвилин після того, як був зроблений оригінальний пост, і ви були трохи швидшими. Здається, ви, хлопці,
зайняті спортом

1
Відповідь ідеальна. Я хочу додати трохи інформації: Основний недолік старого підходу (InstallSchema) полягає в тому, що Magento застосовує зміни наосліп. Наприклад, в одній версії може бути введений новий стовпчик бази даних, який буде видалений лише в наступній. Декларативна установка виключає цей вид непотрібних робіт.
Хафіз Умер

0

Основні модулі Magento 2.3 використовували декларативний підхід до схеми замість сценарію оновлення настройки. Це новий рекомендований підхід у Magento 2.3 і вище. Magento 2.3.x все ще працює з InstallSchema, InstallData, .. і т.д.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.