Magento 2.3のDeclarative Schema


#Magento 2.3のDeclarative Schema 

Declarative Schemaは、Magento2.2までのPHPコードを使用したデータベーススキーマ定義作成を置き換える仕組みです。
Magento2.3から新たに導入された仕組みで、XMLファイルを使用してテーブルの構造などを定義します。



#Magento 2.3のDeclarative Schemaの使用する方法

Declarative Schemaの必要なファイルについてのみ説明します。

まず、フォルダ「Karabiner/Declarative/etc」内にファイル「db_schema.xml」を作成して、次のコードを記述します
 
```xml:db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <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> 
```
 
各テーブルノードは、データベース内のテーブルを表します。

テーブルノードには、次の3種類のサブノードを含めることができます。

- Column
- Constraint
- Index

`setup:upgrade`コマンドを実行すると、テーブル「author_data」が作成されます
 

###新しい列を追加
既存のテーブルに新しい列を追加する場合は、`db_schema.xml`に新しい列ノード(`<column>`)を追加する必要があります。`setup:upgrade`コマンドを実行すると、新しい列が追加されます。

 
```xml:db_schema.xml
<column xsi:type="int" name="new_column" unsigned="true" nullable="true" identity="false" default="" comment="New column"  />
```

###既存の列を削除
既存の列を削除する場合は、テーブルノード内の列ノード（`<column>`）を削除するか、 `disabled`アトリビュートを`true`に設定する必要があります。
 
```xml:db_schema.xml
<column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age" disabled=”true” />
```


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

```bash
php bin/magento setup:db-declaration:generate-whitelist --module-name=Karabiner_Declarative 
```

`Karabiner_Declarative`はモジュール名です。 そこでモジュール名を指定する必要があります。

`setup:upgrade`コマンドを実行すると、列が削除されます。

列タイプを変更し、そのtypeアトリビュートをint、varchar、textなどに変更できます。

 
 
##列の名前を変更
列の名前を変更するには、まず不要な列を削除する必要があります。 別の列を追加します。 その列のデータを新しく作成したものに移行する必要があります。これを行うには、古い列からデータを移行するアトリビュートonCreateを設定する必要があります。
author_email列の名前を「email」に変更する場合は、author_email列を削除して新しい列を追加します。

```xml:db_schema.xml

<column xsi:type="varchar" name="email" onCreate="migrateDataFrom(author_email)" on_update="false" nullable="false" default="" comment="Author Email"/>
<column xsi:type="varchar" name="author_email" unsigned="true" nullable="true" identity="false" default="" comment="Email" disabled=”true” />
```
削除された列のデータで新しい列「email」が作成されます。

##テーブルをドロップ
テーブルを削除するには、テーブルノード全体を「db_schema.xml」から削除するか、「disabled」アトリビュートを「true」に設定します。

```xml:db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <table name="author_data" resource="default" engine="innodb" comment="Author Table" disabled=”true”>
   ....
  </table>
</schema> 
```