Magento 2.3: Como implementar o esquema declarativo no módulo personalizado

14

Eu instalo o magento 2.3 e estou criando um módulo personalizado.

Mas não sei como criar uma tabela de banco de dados personalizada na versão magento 2.3.

Khandhar duro
fonte
2
banco de dados Ou tabela personalizada no banco de dados Magento?
Pawan 30/11
1
Aqui você pode ter mais idéia de criar a tabela usando declarativa esquema em Magento 2.3
Rohit Kundale

Respostas:

39

Primeiro, crie o db_schema.xmlarquivo dentro /RH/Helloworld/etce escreva o seguinte 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> = "Use para criar e definir o nome da tabela"
  • <column> .. </column> = "Use para criar e definir coluna da tabela"
  • <constraint> .. </constraint> = "Use para definir a restrição como chave primária, chave estrangeira, chave exclusiva etc."

Antes de executar o comando upgrade, você precisa adicionar seu esquema ao db_whitelist_schema.jsonarquivo executando o seguinte comando:

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

Agora, existem db_whitelist_schema.jsonarquivos serão criados na /RH/Helloworld/etcpasta.

Agora corra php bin/magento s:up

A tabela será criada dentro do banco de dados.

=> Se você deseja renomear uma coluna, defina a linha abaixo na db_schema.xmlcoluna apropriada:

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

aqui, nome = "novo nome da coluna" e onCreate = "migrateDataFrom ()" = "nome antigo da coluna"

=> Se você desejar descartar a tabela, poderá remover todo o nó da tabela do arquivo xml ou definir o atributo desativado como true, como abaixo da linha do seu db_schema.xml:

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

Para mais detalhes, você pode conferir aqui .

Espero que seja útil para você.

Rohan Hapani
fonte
1
Bom @Rohan
Ramkishan Suthar
Boa explicação ..... Muito obrigado .... É realmente útil ....
Khandar dura
Feliz por ajudar !! Feliz codificação :) & obrigado @RamkishanSuthar
Rohan Hapani
Por que precisamos gerar db_whitelist_schema.json?
Ramanathan
@RohanHapani Como posso criar um atributo de produto personalizado no Magento 2.3.0 usando extensão personalizada?
Kishan Patadia
12

Crie um arquivo nomeado como db_schema.xml na pasta etc em qualquer módulo customizado.

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

Agora crie db_whitelist_schema.json no mesmo caminho

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

Depois disso, execute o php bin / magento setup: upgrade . Para mais informações, você pode conferir aqui . Entre em contato caso precise de mais explicações sobre isso.

Ramkishan Suthar
fonte
Mas ... esta é a mesma resposta que acima. Por que postar em dobro?
precisa saber é o seguinte
@JisseReitsma eu postei antes da resposta acima. verifique o tempo das duas respostas.
Ramkishan Suthar
O meu problema: vocês dois responderam à pergunta 14 minutos após a publicação da postagem original e foram um pouco mais rápidos. Parece que vocês torná-lo um esporte para atender uma nova questão o mais rápido possível :)
Jisse Reitsma
1
A resposta é perfeita. Quero acrescentar mais algumas informações: A principal desvantagem da abordagem antiga (InstallSchema) é que o Magento aplica as alterações às cegas. Por exemplo, em uma versão, uma nova coluna do banco de dados pode ser introduzida, apenas para ser removida na próxima. A instalação declarativa elimina esse tipo de trabalho desnecessário.
HaFiz Umer 8/01
0

Os módulos principais do Magento 2.3 usavam uma abordagem de esquema declarativa em vez do script de atualização da instalação. Esta é uma nova abordagem recomendada no Magento 2.3 e superior. O Magento 2.3.x ainda está trabalhando com InstallSchema, InstallData, etc. etc.

Mark Henry
fonte