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