ヴィランズ手下ランドショーにて復活

こんにちは、この度会社公認サークルとして映画鑑賞サークルが設立されました。月一回映画を見に行く予定です。

10月から活動開始しますので、映画を見るのが好きな方、気になる方はぜひお声がけください。いつでもメンバー募集しております!

cakePHP3 アソシエーション

今回は業務で使用したデータベース周りの仕組み、アソシエーションについてです。

アソシエーションは直訳すると「関連」という意味があり、データベース絡みの文脈で言うアソシエーションはテーブル間の関連性を意味しています。

データベースから一つのテーブルのデータを持ってくるのではなく、関連する複数のテーブルからデータを取ってくる際に必要になります。

具体的には以下の4つがあります。

  • hasOne (1:1)

どちらもuser_idという同じキーをプライマリーキーにしており、各レコードが1:1で対応している場合に用います。

user_idname
1A
2B
user_idfoodcolor
1イカ
2タコ
  • hasMany(多:1)

usersテーブルとadditionsテーブルがあるとします。プライマリーキーはuser_idです。usersテーブルのuser_id一つに対して、additionsテーブルにはuser_idに対応するレコードが複数あります。

idname
1A
2B
usersテーブル
iduser_idfood
11イカ
21タコ
32エイ
additionsテーブル
  • belongsTo(1:多)

hasManyと逆で、additionsテーブルのすべてのレコードは、usersテーブルのいずれかのレコードに属している状態にしたい時はこちらを使います。

  • belongsToMany(多:多)

最後にどちらも複数であればこちらになります。

使いたいテーブルのファイル(例:UsersTable.php)のpublic function initialize(array $config)の中に以下のように書いておけば使えるようになります。

$this->hasMany('Additions', [
            'foreignKey' => 'user_id',
            'dependent' => true,
        ]);
        $this->belongsTo('Stocks', [
            'foreignKey' => 'stock_id',
        ]);

使う時のメソッドは以下のような感じです。

public function findStock(Query $query, array $options)
    {
        $query->select([
            'id',
            'login_id',
            'word',
        ])->contain([
            'Stocks' => [
                'fields' => [
                    'id',
                    'name',
                    'number',
                ]
            ]
        ]);

        return $query;
    }