アソシエーションとは
モデル同士のデータを関連させることで、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を参照。