hook_schemaでテーブルを作ろう
※画像はテーブル作成(物理)の様子です。
hook_schemaでモジュールにテーブルを追加しよう
モジュールを作成するとき、「モジュールで扱うデータを保存するテーブルをデータベースに追加したい!」と思ったことはありませんか?今回はそんなときに使えるhook_schemaという関数についてご説明したいと思います。ちなみに、hook_schemaのschemaとは「一つ以上のテーブルと、それに関係するキーやインデックスを表現する配列構造」だそうです。
hook_schemaを用いたテーブル作成の手順
今回は、例として「shop」というモジュールを作り、データベースに「id」「name」「price」というカラムを持つ「goods」テーブルを追加してみましょう。
.info.ymlでカスタムモジュールを定義
まず、通常のカスタムモジュール作成と同様に、[プロジェクトディレクトリ]/modules/customの下にモジュールディレクトリを作り、その直下に[モジュール名].info.ymlファイルを追加します。
modules/custom/
└── shop
    └── shop.info.yml
shop.info.ymlの中身(例):
name: Shop
description: 商品を管理するモジュール
type: module
core: 8.x
package: custom
この時点で一度モジュールをインストールして正常に認識されているかチェックすることをおすすめします。
.installファイルを作成
では、さっそくhook_schemaにテーブルの定義を書いていきます。
まず、モジュールディレクトリ直下に[モジュール名].installを作ります。
modules/custom/
└── shop
    ├── shop.info.yml
    └── shop.install
.installはインストール時に読み込まれる設定を書くファイルです。つまり、ここにテーブルを定義すると、カスタムモジュールをインストールするときにテーブルがデータベース追加されます。
hook_schemaを定義
.installに以下の内容を書きます。今回はわかりやすさのため、パラメーターを最小限にしてシンプルな構成にしました。
<?php
/**
 * Implements hook_schema().
 */
function shop_schema() {
  $schema['goods'] = [
    'fields' => [
      'id' => [
        'type' => 'int',
      ],
      'name' => [
        'type' => 'varchar',
         'length' => 20,
      ],
      'price' => [
        'type' => 'int',
      ],
    ],
    'primary keys' => ['id'],
  ];
  return $schema;
}
中身を詳しく見てみましょう。
.installもPHPファイルなので<?phpを忘れずに書きます。
<?php
フックを使うのでスタンダードに従って注釈にImplements [hook名]().と書きます。
/**
 * Implements hook_schema().
 */
関数名は[モジュール名]_schemaにします。
function shop_schema() {
$schema['[テーブル名]']でテーブルを定義します。
$schema['goods'] = [
fieldsの中にフィールド(カラム)の情報を書いていきます。
'fields' => [
idフィールドとpriceフィールドはint型のデータを格納します。
'id' => [
        'type' => 'int',
      ]
'price' => [
        'type' => 'int',
      ],
nameフィールドはvarchar型のデータを格納します。varchar型に対してはlengthで長さを設定しなければならないというルールがあるので忘れずに書きましょう。
'name' => [
        'type' => 'varchar',
        'length' => 20,
      ],
ここまで書けばhook_schemaが機能するので、モジュールを再インストールすればテーブルが作られてることが確認できるはずです。
今回はより自然にするために、プライマリーキーも設定しておきましょう。
'primary keys' => ['id'],
しっかりカッコを閉じて、最後に$schemaを返します。
return $schema;
モジュールを再インストール
hook_schemaを定義したら、モジュールをインストールし直してみてください。
drush8とDevelモジュールがインストールされていれば、プロジェクトディレクトリ内で以下のコマンドを入力すれば一発で再インストールできます。
drush dre [モジュール名] //モジュールを再インストール(例:drush dre shop)
drush8はあるけどDevelがないという人は以下のコマンドを使えます。
drush pm-uninstall [モジュール名] //モジュールをアンインストール
drush en [モジュール名] //モジュールをインストール
データベースをチェック
モジュールを再インストールしたら、データベースを確認しましょう。
phpMyAdminから確認
phpMyAdminを使っている場合は、データベースのテーブル一覧から確認出来ます。

データベースのCLI(コマンドラインインターフェース)から確認
直接データベースのCLIから確認する場合は、drushを使うと簡単に目的のデータベースに接続出来ます。
drush sql-cli //sqlのCLIを開く
データベースに接続したら、
show columns from [テーブル名]; //テーブルのカラムを表示(MySQL)
などでフィールドが生成されているかを確認しましょう。

ちゃんと出来てますね!
テーブルの使用について
テーブルを作ったら、あとはデータベースAPIなどを使って自由にデータを保存することができます。データベースAPIについてはこちらのブログをご参考にしてください。
テーブルの削除について
通常Drupalのカスタムモジュールでは、hook_uninstallを使ってモジュールをアンインストールするときに不要になる構成などを削除しますが、hook_schemaで定義したテーブルは、モジュールをアンインストールすると自動的に削除されます。
パラメーターについて
今回はわかりやすさのためミニマルな構成のテーブルを作成しましたが、hook_schemaにはさまざまなパラメーターが用意されており、それらを組み合わせることでフィールドをもっと詳細に定義したり、インデックスや外部キーを設定することが出来ます。パラメーターについてはこちらの記事にまとめたのでご参考にしていただけると幸いです。
drushでショートカット
上記のようにファイル一個一個を手書きしなくても、drush generate moduleでモジュールの雛形を作成することができます。Would you like to create install file?でYesにするとあらかじめ[モジュール名]_schema()が書かれた状態の.installファイルが作成されるので便利です!




