【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を参照。


イソップへのお悩み相談募集中

イソップに相談しませんか?

当ブログで紹介しているような、Web制作やフリーランスへの悩みをイソップに相談してみませんか?
回答できることがあれば記事の中でご紹介します。