Magento 2.3: Cómo implementar un esquema declarativo en un módulo personalizado

Respuestas:

39

En primer lugar, cree un db_schema.xmlarchivo dentro /RH/Helloworld/etcy escriba el siguiente código:

<?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> = "Usar para crear y establecer el nombre de la tabla"
  • <column> .. </column> = "Usar para crear y establecer la columna de la tabla"
  • <constraint> .. </constraint> = "Usar para establecer restricciones como clave principal, clave externa, clave única, etc."

Antes de ejecutar el comando de actualización, debe agregar su esquema al db_whitelist_schema.jsonarchivo ejecutando el siguiente comando:

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

Ahora, se db_whitelist_schema.jsoncrearán archivos en la /RH/Helloworld/etccarpeta.

Ahora corre php bin/magento s:up

La tabla se creará dentro de la base de datos.

=> Si desea cambiar el nombre de una columna, debe establecer la siguiente línea en la db_schema.xmlcolumna correspondiente:

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

aquí, name = "nombre de columna nueva" y onCreate = "migrateDataFrom ()" = "nombre de columna anterior"

=> Si desea soltar la tabla, puede eliminar todo el nodo de la tabla del archivo xml o puede establecer el atributo deshabilitado en verdadero como en la línea siguiente en su db_schema.xml:

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

Para más detalles, puedes consultar aquí .

Espero que te sea útil.

Rohan Hapani
fuente
1
Good one @Rohan
Ramkishan Suthar
Buena explicación ..... Muchas gracias .... Es realmente útil ....
dura khandhar
Feliz de ayudar !! Feliz codificación :) y gracias @RamkishanSuthar
Rohan Hapani
¿Por qué necesitamos generar db_whitelist_schema.json?
Ramanathan
@RohanHapani ¿Cómo puedo crear un atributo de producto personalizado en Magento 2.3.0 usando una extensión personalizada?
Kishan Patadia
12

Cree un archivo llamado db_schema.xml en la carpeta etc en cualquier módulo personalizado.

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

Ahora cree db_whitelist_schema.json en la misma ruta

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

Después de eso, simplemente ejecute php bin / magento setup: upgrade . Para más información puedes consultar aquí . Avísame en caso de que necesites más explicaciones sobre esto.

Ramkishan Suthar
fuente
Pero ... esta es la misma respuesta que la anterior. ¿Por qué doble publicación?
Jisse Reitsma
@JisseReitsma publiqué antes de la respuesta anterior. Verifique el tiempo de ambas respuestas.
Ramkishan Suthar
Lo malo: ambos respondieron la pregunta dentro de los 14 minutos posteriores a la publicación original y fueron un poco más rápidos. Parece que ustedes hacen deporte responder una nueva pregunta lo antes posible :)
Jisse Reitsma
1
La respuesta es perfecta. Quiero agregar más información: la principal desventaja del enfoque anterior (InstallSchema) es que Magento aplica los cambios a ciegas. Por ejemplo, en una versión se puede introducir una nueva columna de base de datos, que solo se eliminará en la siguiente. La configuración declarativa elimina este tipo de trabajo innecesario.
HaFiz Umer
0

Los módulos principales de Magento 2.3 utilizaron un enfoque de esquema declarativo en lugar del script de actualización de configuración. Este es un nuevo enfoque recomendado en Magento 2.3 y superior. Magento 2.3.x todavía funciona con InstallSchema, InstallData, etc.

Mark Henry
fuente