Magento 2.3: So implementieren Sie ein deklaratives Schema in einem benutzerdefinierten Modul

13

Ich installiere das Magento 2.3 und erstelle ein benutzerdefiniertes Modul.

Ich weiß jedoch nicht, wie ich eine benutzerdefinierte Datenbanktabelle in der Magento 2.3-Version erstellen soll.

harte Khandhar
quelle
2
Datenbank oder benutzerdefinierte Tabelle in der Magento-Datenbank?
Pawan
1
Hier können Sie mehr über das Erstellen einer Tabelle mit dem deklarativen Schema in Magento 2.3
Rohit Kundale

Antworten:

38

Erstellen Sie zunächst eine db_schema.xmlDatei /RH/Helloworld/etcund schreiben Sie den folgenden Code:

<?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> = "Zum Erstellen und Festlegen des Tabellennamens verwenden"
  • <column> .. </column> = "Zum Erstellen und Festlegen einer Spalte der Tabelle verwenden"
  • <constraint> .. </constraint> = "Verwendung für festgelegte Einschränkungen wie Primärschlüssel, Fremdschlüssel, eindeutiger Schlüssel usw."

Bevor Sie den Upgrade-Befehl ausführen, müssen Sie Ihr Schema zur db_whitelist_schema.jsonDatei hinzufügen, indem Sie den folgenden Befehl ausführen:

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

Jetzt werden db_whitelist_schema.jsonDateien im /RH/Helloworld/etcOrdner erstellt.

Jetzt renn los php bin/magento s:up

Die Tabelle wird in der Datenbank erstellt.

=> Wenn Sie eine Spalte umbenennen möchten, müssen Sie db_schema.xmlin der entsprechenden Spalte die folgende Zeile einfügen:

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

hier name = "neuer Spaltenname" und onCreate = "migrateDataFrom ()" = "alter Spaltenname"

=> Wenn Sie eine Tabelle löschen möchten, können Sie entweder den gesamten Tabellenknoten aus der XML-Datei entfernen oder das Attribut disabled auf true setzen, wie in der folgenden Zeile angegeben db_schema.xml:

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

Weitere Details finden Sie hier .

Hoffe, es wird für Sie hilfreich sein.

Rohan Hapani
quelle
1
Gute @Rohan
Ramkishan Suthar
Schöne Erklärung ..... Vielen Dank .... Es ist wirklich hilfreich ....
harte Khandhar
Freue mich zu helfen !! Viel
Spaß
Warum müssen wir db_whitelist_schema.json generieren?
Ramanathan
@RohanHapani Wie kann ich ein benutzerdefiniertes Produktattribut in Magento 2.3.0 mit einer benutzerdefinierten Erweiterung erstellen?
Kishan Patadia
11

Erstellen Sie eine Datei mit dem Namen db_schema.xml im Ordner etc in einem beliebigen benutzerdefinierten Modul.

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

Erstellen Sie nun db_whitelist_schema.json unter demselben Pfad

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

Danach führen Sie einfach php bin / magento setup: upgrade aus . Weitere Informationen finden Sie hier . Lassen Sie es mich wissen, falls Sie weitere Erklärungen benötigen.

Ramkishan Suthar
quelle
Aber ... das ist die gleiche Antwort wie oben. Warum doppelte Post?
Jisse Reitsma
@JisseReitsma Ich habe vor der obigen Antwort gepostet. Überprüfen Sie die Zeit beider Antworten.
Ramkishan Suthar
Mein schlechtes: Sie beide haben die Frage innerhalb von 14 Minuten nach dem ursprünglichen Beitrag beantwortet und waren nur ein bisschen schneller. Es scheint, dass ihr es zu einem Sport macht, eine neue Frage so schnell wie möglich zu beantworten :)
Jisse Reitsma
Die Antwort ist perfekt. Ich möchte noch einige Informationen hinzufügen: Der Hauptnachteil des alten Ansatzes (InstallSchema) besteht darin, dass Magento Änderungen blind anwendet. Beispielsweise kann in einer Version eine neue Datenbankspalte eingeführt werden, die in der nächsten entfernt wird. Durch die deklarative Einrichtung entfällt diese Art unnötiger Arbeit.
HaFiz Umer
0

Magento 2.3-Kernmodule verwendeten anstelle des Setup-Upgrade-Skripts einen deklarativen Schema-Ansatz. Dies ist ein neuer empfohlener Ansatz in Magento 2.3 und höher. Magento 2.3.x arbeitet immer noch mit InstallSchema, InstallData usw.

Mark Henry
quelle