こんにちはRujuuです。
今回はCakePHPの入れ子データベースの作成方法を紹介します。
※データベースがまだできていない人は、こちらの記事を参考に作成してください!
【初心者】CakePHP3の初期設定とデータベース接続以下のような手順で行っていきます!
- テーブル作成
- bakeコマンドでModel作成
- bakeコマンドでTemplate作成
- bakeコマンドでContoroller作成
- テーブル同士の関係をカスタマイズ
まず、データベースにテーブルを作成します。
ポートを変更していない人は、「http://localhost/phpmyadmin/」で、
ポートを変更している人は、「http://localhost:ポート番号/phpmyadmin/」から、phpMyAdminへログインします。
ログインしたら、CakePHPに接続されているデータベースを選択し、新しいテーブルを作成していきます。
私の場合は、上記記事で「relation_sample」データベースをCakePHPに接続したので、以降接続済みのデータベースを「relation_sample」データベースと呼んでいきます。
今回は、入れ子データベースがどういうものなのか、実際に想像しやすいように「人」と「趣味」の入れ子データベースを作成していきます。
具体的には、以下のテーブルを作成するのが目標です。
usersテーブル(人)
id | name | age |
---|---|---|
1 | 山田 | 22 |
2 | 佐藤 | 21 |
hobbysテーブル(趣味)
id | hobby | user_id |
---|---|---|
1 | 読書 | 1 |
2 | ゲーム | 2 |
3 | 散歩 | 2 |
最初に、「users」というテーブル名を以下のように入力し、作成を押します。
次にテーブルの列(カラム)を作成していきます。
とりあえず、id列とname列、age列を作成しましょう。この時、id列の数字はユニーク且つ自動で割り振られて欲しいため、「A_I」部分にチェックを入れておきます。
また、name列の型(タイプ)である「VARCHER」は、文字列の長さを指定しなければならないため、長さの箇所に「382」を指定しておきます。もちろん、382文字もいらないと思う方は好きな文字数を入力してください。
上手くいくと画像のような画面になっているはずなので、下の「保存する」ボタンから保存します。
上記画像が見づらい場合は、画像をクリック(タッチ)すると拡大出来るようになります。
先ほどと同様にテーブル名欄に「hobbys」と入力し作成を押します。
hobbysテーブルにはid列とhobby列、そしてuser_id列を追加していきます。
id列はusersと同じく「A_I」部分にチェックを、hobby列は文字列を入力したいのでVARCHERを設定します。
VARCHERの文字列はとりあえず382文字にしておきます(何文字でもOKです)。
user_id列は少し特殊で、usersテーブルのidが入ってくるためINTのままにしておきます。
この「user_id」の「user」は先ほど作成した「users」テーブルから「s」をとったものです。
上手くいくと画像のような画面になっているはずなので、下の「保存する」ボタンから保存します。
画像が見づらい場合は、画像をクリック(タッチ)すると拡大できるようになります。
次に、bakeコマンドを使ってModelを作成していきます。
まずはコマンドプロンプトなどを使用して「/c/xampp/htdocs/作成したプロジェクト名/」まで移動します。
私の場合は、htdocsの下にtestフォルダを作成し、その中にrelation_sampleというプロジェクトを作成したため「/c/xampp/htdocs/test/relation_sample」となります。
移動出来たら、下記のコマンドで作成可能なModelを調べます。
./bin/cake bake model
「./bin/cake」となっているのは、現在いるフォルダの下にあるbinフォルダの中にcake.batファイルが置いてあるからです。
正しくusersテーブルとhobbysテーブルがデータベース上に作成されていると、以下のような表示が出てきます。
これはhobbysテーブルとusersテーブルのModelを作成することができるよ~!という意味です。
2つのテーブルを作成できることを確認したら、下記のコマンドでusersのModelを作成しましょう。
./bin/cake bake model users
上手くいくと「/c/xampp/htdocs/作成したプロジェクト名/src/Model/Table/」の中に「UsersTable.php」が作成されているはずです。
続いて、hobbysのModelも下記のコードで作成していきます。
./bin/cake bake model hobbys
UsersTable.phpと同じ階層に「HobbysTable.php」が作成されているはずです。
次に、bakeコマンドでTemplateを作成していきます。
usersのTemplateは下記コマンドで、
./bin/cake bake template users
hobbysのTemplateは下記コマンドで作成します。
./bin/cake bake template hobbys
上手くいくと、「/c/xampp/htdocs/作成したプロジェクト名/src/Template/」の中に「Users」と「Hobbys」というフォルダが作成されます。
続いてbakeコマンドでContorollerを作成していきます。
usersのContorollerは下記コマンドで、
./bin/cake bake controller users
hobbysのContorollerは下記コマンドで作成します。
./bin/cake bake controller hobbys
上手くいくと、「/c/xampp/htdocs/作成したプロジェクト名/src/Contoroller/」の中に「UsersController.php」と「HobbysController.php」というフォルダが作成されるはずです。
最後に、親テーブルと子テーブルの関係を少しカスタマイズします。
今のままの設定だと、親データ(users)の情報が削除されても、子データ(hobbys)がそのまま残ってしまいます。
これを、親データが削除された場合は子データも削除されるようにします。
VScodeなどのコードエディタ・テキストエディタで「/c/xampp/htdocs/作成したプロジェクト名/src/Model/Table/UsersTable.php」を開きます。
すると31行目あたりに下記のような記述が見つかると思います。
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('users');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->hasMany('Hobbys', [
'foreignKey' => 'user_id',
]);
}
この、上記でいう10行目の下に「’dependent’ => true,」を追加します。
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('users');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->hasMany('Hobbys', [
'foreignKey' => 'user_id',
//下記を追加
'dependent' => true,
]);
}
これだけで、親データが削除されると子データが削除されるようになります。
ここまで読んでくださり、ありがとうございました!
上手く入れ子データベースは作成できたでしょうか?
次回は、入れ子データベースへのデータ一括保存の方法を紹介します。
【初心者】CakePHP3入れ子データベースへの一括保存方法