※画像はテーブル作成(物理)の様子です。

hook_schemaでモジュールにテーブルを追加しよう

モジュールを作成するとき、「モジュールで扱うデータを保存するテーブルをデータベースに追加したい!」と思ったことはありませんか?今回はそんなときに使えるhook_schemaという関数についてご説明したいと思います。ちなみに、hook_schemaschemaとは「一つ以上のテーブルと、それに関係するキーやインデックスを表現する配列構造」だそうです。

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ファイルが作成されるので便利です!


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。