【CakePHP】Modelのアソシエーション(関連付け)

アソシエーションとは

モデル同士のデータを関連させることで、1度の操作で複数のモデルからデータを取得したり、データを更新できる機能。

アソシエーション(リレーションシップ)の種類

モデルのプロパティとして設定する。

Name Description Example
belongsTo モデルが上位のモデルに所属する多対一の関係を定義 public $belongsTo = array('User');
hasMany モデルが下位のモデルを複数件所有する一対多の関係を定義 public $hasMany = array('Task');
hasOne モデルが下位のモデル1件所有する一対一の関係を定義 public $hasOne = array('Profile');
hasAndBelongsToMany モデルが中間のモデルを通じて複数のデータに所属する多対多の関係を定義する public $hasAndBelongsToMany = array('Member' => array('className' => 'Group'));

belongsTo

モデルが別のモデルのデータに所属しているという関係のアソシエーション。belongs to(所属)。
例えば、ブログ記事のコメントやSNSなどのアカウントプロフィールなどデータが所有者のIDを保持しているようなデータ構造。

belongsToの利用例

<?php

class Comment extends AppModel {

    public $belongsTo = array('Article');

}

アソシエーションが設定されたモデルを利用する

<?php

class CommentsController extends AppController {

    public function index() {
        $data = $this->Comment->find('all');
        debug($data);
    }

}

belongsTo – CakePHP Cookbook 2.x ドキュメント

hasMany

モデルが別のモデルにある複数のデータを所有しているという関係。belongsToとは逆の関係。
belongsToが設定されている場合、逆側からはhasManyの関係が設定できる。
例えば、ブログ記事やSNSのアカウントなどデータ自身が所有者であるようなデータ構造。

hasManyの利用例

<?php

class Article extends AppModel {

    public $hasMany = array('Comment');

}

hasMany – CakePHP Cookbook 2.x ドキュメント

hasOne

hasOneは、hasManyと同じくモデルが別のモデルのデータを所有するという関係のアソシエーション。
hasManyと違い対象のデータが必ず1件になる。

hasOneの利用例

<?php

class Topic extends AppModel {

    public $hasMany = array('Comment');

}

hasOne – CakePHP Cookbook 2.x ドキュメント

hasAndBelongsToMany

多対多の関係でモデルとモデルを結びつけるアソシエーション。
1つの要素に対して複数のタグやカテゴリを割り当てるようなデータ構造に使われる。
このデータ構造を使うには中間になるテーブルを作成して、テーブル名を2つのモデル名をアンダースコアでつないだ形にする。

hasAndBelongsToManyの利用例

<?php

class Recipe extends AppModel {

    public $name = 'Recipe';
    public $hasAndBelongsToMany = array(
        'Ingredient' => array(
            'className' => 'Ingredient',
            'joinTable' => 'ingredients_recipes',
            'foreignKey' => 'recipe_id',
            'associationForeignKey' => 'ingredient_id',
            ...
        )
    )

}

hasAndBelongsToMany – CakePHP Cookbook 2.x ドキュメント

各リレーションシップにはオプションを設定可能。各項目のCookbookを参照。

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.