Magento 2.3:カスタムモジュールに宣言型スキーマを実装する方法


14

magento 2.3をインストールし、カスタムモジュールを作成しています。

しかし、magento 2.3バージョンでカスタムデータベーステーブルを作成する方法がわかりません。


2
データベースまたはMagentoデータベースのカスタムテーブル?
Pawan

回答:


40

まず、db_schema.xml内部にファイル/RH/Helloworld/etcを作成し、次のコードを記述します。

<?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> = "テーブル名の作成と設定に使用"
  • <column> .. </column> = "テーブルの列の作成と設定に使用"
  • <constraint> .. </constraint> =「主キー、外部キー、一意キーなどの制約の設定に使用」

upgradeコマンドを実行する前にdb_whitelist_schema.json、次のコマンドを実行してスキーマをファイルに追加する必要があります。

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

これで、フォルダにdb_whitelist_schema.jsonファイルが作成され/RH/Helloworld/etcます。

今、実行します php bin/magento s:up

テーブルはデータベース内に作成されます。

=>列の名前を変更したい場合はdb_schema.xml、適切な列で以下の行を設定する必要があります:

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

ここでは、name = "新しい列名"およびonCreate = "migrateDataFrom()" = "古い列名"

=>テーブルを削除したい場合は、XMLファイルからテーブルノード全体を削除するか、次のようにdisabled属性をtrueに設定してくださいdb_schema.xml

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

詳細については、次の操作を行うことができ、ここで確認してください

よろしくお願いいたします。


1
グッドワン@Rohan
Ramkishan Suthar

素敵な説明.....ありがとうございました...本当に
助かり

お力になれて、嬉しいです !!ハッピーコーディング:)&ありがとう@RamkishanSuthar
Rohan Hapani 2018年

なぜdb_whitelist_schema.jsonを生成する必要があるのですか?
ラマナサン

@RohanHapaniカスタム拡張を使用してMagento 2.3.0でカスタム製品属性を作成するにはどうすればよいですか?
Kishan Patadia 2018

11

カスタムモジュールのetcフォルダーの下にdb_schema.xmlという名前のファイルを作成します。

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

同じパスにdb_whitelist_schema.jsonを作成します

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

その後、php bin / magento setup:upgradeを実行します。詳細については、ここで確認できます。これについてさらに説明が必要な場合はお知らせください。


しかし...これは上記と同じ答えです。なぜ二重ポストなのか?
Jisse Reitsma

上記の回答の前に投稿した@JisseReitsma。両方の回答の時間を確認してください。
Ramkishan Suthar

私の悪い点:元の投稿が作成されてから14分以内に質問に回答しましたが、どちらも少し速かったです。皆さんは、できるだけ早く新しい質問に答えることがスポーツになっているようです:)
Jisse Reitsma

答えは完璧です。さらに情報を追加したい:古いアプローチ(InstallSchema)の主な欠点は、Magentoが変更を盲目的に適用することです。たとえば、あるバージョンでは、新しいデータベース列が導入され、次のバージョンでのみ削除される場合があります。宣言型のセットアップにより、このタイプの不要な作業がなくなります。
HaFiz Umer


0

Magento 2.3コアモジュールは、セットアップアップグレードスクリプトの代わりに宣言型スキーマアプローチを使用していました。これは、Magento 2.3以降での新しい推奨アプローチです。Magento 2.3.xは、InstallSchema、InstallDataなどで引き続き機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.