Magento 2.3: Jak zaimplementować schemat deklaratywny w module niestandardowym

Odpowiedzi:

39

Przede wszystkim utwórz db_schema.xmlplik w środku /RH/Helloworld/etci napisz następujący kod:

<?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> = "Użyj do utworzenia i ustawienia nazwy tabeli"
  • <column> .. </column> = "Użyj do utworzenia i ustawienia kolumny tabeli"
  • <constraint> .. </constraint> = "Użyj do ustawienia ograniczenia, takiego jak klucz podstawowy, klucz obcy, klucz unikalny itp."

Przed uruchomieniem polecenia aktualizacji należy dodać schemat do db_whitelist_schema.jsonpliku, uruchamiając następujące polecenie:

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

Teraz db_whitelist_schema.jsonw /RH/Helloworld/etcfolderze zostaną utworzone pliki .

A teraz biegnij php bin/magento s:up

Tabela zostanie utworzona w bazie danych.

=> Jeśli chcesz zmienić nazwę kolumny, musisz ustawić poniżej wiersza w db_schema.xmlodpowiedniej kolumnie:

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

tutaj name = "nowa nazwa kolumny" i onCreate = "migrateDataFrom ()" = "stara nazwa kolumny"

=> Jeśli chcesz usunąć tabelę, możesz albo usunąć cały węzeł tabeli z pliku xml, albo możesz ustawić atrybut disabled na true, tak jak poniżej linii w twoim db_schema.xml:

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

Aby uzyskać więcej informacji, możesz sprawdzić tutaj .

Mam nadzieję, że to ci pomoże.

Rohan Hapani
źródło
1
Dobry jeden @Rohan
Ramkishan Suthar
Ładne wyjaśnienie ... Dziękuję bardzo .... To jest naprawdę pomocne ....
harsh khandhar
Chętnie pomoże !! Miłego kodowania :) i dziękuję @RamkishanSuthar
Rohan Hapani
Dlaczego musimy wygenerować db_whitelist_schema.json?
Ramanathan
@RohanHapani Jak mogę utworzyć niestandardowy atrybut produktu w Magento 2.3.0 za pomocą niestandardowego rozszerzenia?
Kishan Patadia
12

Utwórz plik o nazwie db_schema.xml w folderze etc w dowolnym module niestandardowym.

<?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>

Teraz utwórz db_whitelist_schema.json przy tej samej ścieżce

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

Następnie wystarczy uruchomić konfigurację php bin / magento: upgrade . Aby uzyskać więcej informacji, możesz sprawdzić tutaj . Daj mi znać, jeśli potrzebujesz więcej wyjaśnień na ten temat.

Ramkishan Suthar
źródło
Ale ... to ta sama odpowiedź jak powyżej. Dlaczego podwójny post?
Jisse Reitsma
@JisseReitsma Wysłałem przed powyższą odpowiedzią. sprawdź czas obu odpowiedzi.
Ramkishan Suthar
Moja zła: oboje odpowiedzieliście na to pytanie w ciągu 14 minut po opublikowaniu oryginalnego postu i byliście nieco szybsi. Wygląda na to, że jak najszybciej sportem jest odpowiedzieć na nowe pytanie :)
Jisse Reitsma
1
Odpowiedź jest idealna. Chcę dodać więcej informacji: Główną wadą starego podejścia (InstallSchema) jest to, że Magento ślepo stosuje zmiany. Na przykład w jednej wersji można wprowadzić nową kolumnę bazy danych, którą należy usunąć w następnej. Deklaratywna konfiguracja eliminuje ten rodzaj niepotrzebnej pracy.
HaFiz Umer
0

W podstawowych modułach Magento 2.3 zastosowano skrypt deklaratywny zamiast skryptu aktualizacji instalatora. Jest to nowe zalecane podejście w Magento 2.3 i nowszych. Magento 2.3.x nadal działa z InstallSchema, InstallData, itp.

Mark Henry
źródło