【初心者】CakePHP3の入れ子データベースの作成

入れ子データベースの作成

こんにちはRujuuです。

今回はCakePHPの入れ子データベースの作成方法を紹介します。


※データベースがまだできていない人は、こちらの記事を参考に作成してください!

初期設定とDB接続 【初心者】CakePHP3の初期設定とデータベース接続

手順

以下のような手順で行っていきます!

  1. テーブル作成
  2. bakeコマンドでModel作成
  3. bakeコマンドでTemplate作成
  4. bakeコマンドでContoroller作成
  5. テーブル同士の関係をカスタマイズ

テーブル作成

まず、データベースにテーブルを作成します。

ポートを変更していない人は、「http://localhost/phpmyadmin/」で、

ポートを変更している人は、「http://localhost:ポート番号/phpmyadmin/」から、phpMyAdminへログインします。

ログインしたら、CakePHPに接続されているデータベースを選択し、新しいテーブルを作成していきます。

補足

私の場合は、上記記事で「relation_sample」データベースをCakePHPに接続したので、以降接続済みのデータベースを「relation_sample」データベースと呼んでいきます。

今回は、入れ子データベースがどういうものなのか、実際に想像しやすいように「人」と「趣味」の入れ子データベースを作成していきます。

具体的には、以下のテーブルを作成するのが目標です。

usersテーブル(人)

idnameage
1山田22
2佐藤21

hobbysテーブル(趣味)

idhobbyuser_id
1読書1
2ゲーム2
3散歩2

usersテーブル作成

最初に、「users」というテーブル名を以下のように入力し、作成を押します。

usersテーブルの作成画面

次にテーブルの列(カラム)を作成していきます。

とりあえず、id列とname列、age列を作成しましょう。この時、id列の数字はユニーク且つ自動で割り振られて欲しいため、「A_I」部分にチェックを入れておきます。

また、name列の型(タイプ)である「VARCHER」は、文字列の長さを指定しなければならないため、長さの箇所に「382」を指定しておきます。もちろん、382文字もいらないと思う方は好きな文字数を入力してください。

上手くいくと画像のような画面になっているはずなので、下の「保存する」ボタンから保存します。

usersテーブルの構造

上記画像が見づらい場合は、画像をクリック(タッチ)すると拡大出来るようになります。

hobbyテーブル作成

先ほどと同様にテーブル名欄に「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」をとったものです。

ポイント

便利なことにCakePHPは、idを引っ張ってほしいテーブル名から「s」を抜き、末尾に「_id」を付けると、自動でidを紐づけてくれるようになります。

上手くいくと画像のような画面になっているはずなので、下の「保存する」ボタンから保存します。

hobbysテーブルの構造

画像が見づらい場合は、画像をクリック(タッチ)すると拡大できるようになります。

bakeコマンドでModel作成

次に、bakeコマンドを使ってModelを作成していきます。

まずはコマンドプロンプトなどを使用して「/c/xampp/htdocs/作成したプロジェクト名/」まで移動します。

私の場合は、htdocsの下にtestフォルダを作成し、その中にrelation_sampleというプロジェクトを作成したため「/c/xampp/htdocs/test/relation_sample」となります。

移動出来たら、下記のコマンドで作成可能なModelを調べます。

bash
./bin/cake bake model

「./bin/cake」となっているのは、現在いるフォルダの下にあるbinフォルダの中にcake.batファイルが置いてあるからです。

正しくusersテーブルとhobbysテーブルがデータベース上に作成されていると、以下のような表示が出てきます。

./bin/cake bake modelの結果

これはhobbysテーブルとusersテーブルのModelを作成することができるよ~!という意味です。

2つのテーブルを作成できることを確認したら、下記のコマンドでusersのModelを作成しましょう。

bash
./bin/cake bake model users

上手くいくと「/c/xampp/htdocs/作成したプロジェクト名/src/Model/Table/」の中に「UsersTable.php」が作成されているはずです。

続いて、hobbysのModelも下記のコードで作成していきます。

bash
./bin/cake bake model hobbys

UsersTable.phpと同じ階層に「HobbysTable.php」が作成されているはずです。

bakeコマンドでTemplate作成

次に、bakeコマンドでTemplateを作成していきます。

usersのTemplateは下記コマンドで、

bash
./bin/cake bake template users

hobbysのTemplateは下記コマンドで作成します。

HTML
./bin/cake bake template hobbys

上手くいくと、「/c/xampp/htdocs/作成したプロジェクト名/src/Template/」の中に「Users」と「Hobbys」というフォルダが作成されます。

bakeコマンドでContoroller作成

続いてbakeコマンドでContorollerを作成していきます。

usersのContorollerは下記コマンドで、

bash
./bin/cake bake controller users

hobbysのContorollerは下記コマンドで作成します。

HTML
./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行目あたりに下記のような記述が見つかると思います。

UserTable.php
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,」を追加します。

UserTable.php
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入れ子データベースへの一括保存方法

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA