Magento 2.3: come implementare lo schema dichiarativo nel modulo personalizzato


Risposte:


39

Prima di tutto, crea il db_schema.xmlfile all'interno /RH/Helloworld/etce scrivi il seguente codice:

<?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> = "Usa per creare e impostare il nome della tabella"
  • <column> .. </column> = "Usa per creare e impostare la colonna della tabella"
  • <constraint> .. </constraint> = "Utilizzare per impostare il vincolo come chiave primaria, chiave esterna, chiave univoca ecc."

Prima di eseguire il comando upgrade è necessario aggiungere lo schema al db_whitelist_schema.jsonfile eseguendo il comando seguente:

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

Ora, ci sono db_whitelist_schema.jsonfile verranno creati nella /RH/Helloworld/etccartella.

Adesso corri php bin/magento s:up

La tabella verrà creata all'interno del database.

=> Se vuoi rinominare una colonna, devi impostare la riga sotto nella db_schema.xmlcolonna appropriata:

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

qui, name = "nome nuova colonna" e onCreate = "migrateDataFrom ()" = "vecchio nome colonna"

=> Se vuoi eliminare la tabella, puoi rimuovere l'intero nodo della tabella dal file xml oppure puoi impostare l'attributo disabilitato su true come come sotto la riga nel tuo db_schema.xml:

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

Per maggiori dettagli, puoi controllare qui .

Spero, ti sarà utile.


1
Buona @Rohan
Ramkishan Suthar il

Bella spiegazione ..... Grazie mille .... È davvero utile ....
Khandhar duro

Felice di aiutare !! Buona programmazione :) & Grazie @RamkishanSuthar
Rohan Hapani

Perché dobbiamo generare db_whitelist_schema.json?
Ramanathan,

@RohanHapani Come posso creare un attributo del prodotto personalizzato in Magento 2.3.0 usando l'estensione personalizzata?
Kishan Patadia,

12

Crea il file denominato db_schema.xml nella cartella etc nel tuo modulo personalizzato.

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

Ora crea db_whitelist_schema.json nello stesso percorso

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

Dopo di che basta eseguire php bin / magento setup: upgrade . Per ulteriori informazioni è possibile controllare qui . Fammi sapere se hai bisogno di ulteriori spiegazioni al riguardo.


Ma ... questa è la stessa risposta di cui sopra. Perché doppio post?
Jisse Reitsma,

@JisseReitsma ho pubblicato prima la risposta sopra. controlla il tempo di entrambe le risposte.
Ramkishan Suthar,

Mio male: entrambi avete risposto alla domanda entro 14 minuti dopo che il post originale era stato pubblicato ed eravate un po 'più veloci. Sembra che voi ragazzi sia uno sport per rispondere a una nuova domanda il prima possibile :)
Jisse Reitsma,

1
La risposta è perfetta Voglio aggiungere qualche informazione in più: il principale svantaggio del vecchio approccio (InstallSchema) è che Magento applica le modifiche alla cieca. Ad esempio, in una versione potrebbe essere introdotta una nuova colonna del database, che verrà rimossa solo nella successiva. L'installazione dichiarativa elimina questo tipo di lavoro non necessario.
HaFiz Umer

0

I moduli principali di Magento 2.3 hanno utilizzato un approccio a schema dichiarativo anziché lo script di aggiornamento dell'installazione. Questo è un nuovo approccio consigliato in Magento 2.3 e versioni successive. Magento 2.3.x funziona ancora con InstallSchema, InstallData, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.