Magento 2.3: Comment implémenter un schéma déclaratif dans un module personnalisé

Réponses:

39

Tout d'abord, créez un db_schema.xmlfichier à l'intérieur /RH/Helloworld/etcet écrivez le code suivant:

<?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> = "Utiliser pour créer et définir le nom de la table"
  • <column> .. </column> = "Utiliser pour créer et définir une colonne de la table"
  • <constraint> .. </constraint> = "Utiliser pour définir la contrainte comme la clé primaire, la clé étrangère, la clé unique, etc."

Avant d'exécuter la commande de mise à niveau, vous devez ajouter votre schéma au db_whitelist_schema.jsonfichier en exécutant la commande suivante:

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

Maintenant, un db_whitelist_schema.jsonfichier sera créé dans le /RH/Helloworld/etcdossier.

Maintenant, lancez php bin/magento s:up

La table sera créée dans la base de données.

=> Si vous souhaitez renommer une colonne, vous devez définir la ligne ci-dessous dans votre db_schema.xmlcolonne appropriée:

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

ici, name = "nouveau nom de colonne" et onCreate = "migrateDataFrom ()" = "ancien nom de colonne"

=> Si vous souhaitez supprimer la table, vous pouvez soit supprimer le nœud de table entier du fichier xml, soit définir l'attribut désactivé sur true comme la ligne ci-dessous dans votre db_schema.xml:

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

Pour plus de détails, vous pouvez vérifier ici .

J'espère que cela vous sera utile.

Rohan Hapani
la source
1
Good one @Rohan
Ramkishan Suthar
Belle explication ..... Merci beaucoup .... C'est vraiment utile ....
khandhar dur
Heureux d'aider !! Joyeux codage :) & Merci @RamkishanSuthar
Rohan Hapani
Pourquoi devons-nous générer db_whitelist_schema.json?
Ramanathan
@RohanHapani Comment puis-je créer un attribut de produit personnalisé dans Magento 2.3.0 en utilisant une extension personnalisée?
Kishan Patadia
12

Créez un fichier nommé db_schema.xml sous le dossier etc dans votre module personnalisé.

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

Créez maintenant db_whitelist_schema.json sur le même chemin

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

Après cela, lancez simplement la configuration de php bin / magento: mise à niveau . Pour plus d'informations, vous pouvez consulter ici . Faites-moi savoir au cas où vous auriez besoin de plus d'explications à ce sujet.

Ramkishan Suthar
la source
Mais ... c'est la même réponse que ci-dessus. Pourquoi double poste?
Jisse Reitsma
@JisseReitsma J'ai posté avant la réponse ci-dessus. vérifier l'heure des deux réponses.
Ramkishan Suthar
Mon mauvais: vous avez tous deux répondu à la question dans les 14 minutes suivant la publication du message d'origine et vous avez été un peu plus rapide. Il semble que vous en fassiez un sport de répondre à une nouvelle question dès que possible :)
Jisse Reitsma
1
La réponse est parfaite. Je veux ajouter quelques informations plus: Le principal inconvénient de l'ancienne approche (InstallSchema) est que Magento applique les changements à l'aveugle. Par exemple, dans une version, une nouvelle colonne de base de données peut être introduite, pour être supprimée dans la suivante. La configuration déclarative élimine ce type de travail inutile.
HaFiz Umer
0

Les modules principaux de Magento 2.3 ont utilisé une approche de schéma déclaratif au lieu du script de mise à niveau de l'installation. Il s'agit d'une nouvelle approche recommandée dans Magento 2.3 et supérieur. Magento 2.3.x fonctionne toujours avec InstallSchema, InstallData, .. etc.

Marc Henry
la source