モデルの動的なアソシエーション
CakePHP にはアソシエーションという機能があります。
アソシエーションとはモデル間の依存関係のことで、通常はモデルを設計するタイミングで指定します。次の例は User モデルには Profile モデルと一対一の関係があることを設定しています。
class User extends AppModel { var $name = "User"; var $hasOne = array("Profile" => array("className" => "Profile", "conditions" => "", "order" => "", "dependent" => true, "foreignKey" => "user_id" ) ); }
従来は User モデルと対応する Profile モデルを取得する際には SQL の JOIN が必要でした。しかし、アソシエーションを利用することで、 $appModelInstance->find() の1回で User モデルと Profile モデルを取得できるようになります。
しかし、これほど有用なアソシエーションが枷になる場合があります。アソシエーションは関連するモデルを一度に取得できますが、逆に言うと関連するモデルまでもを一度に取得してしまうのです。いうまでもなくデータ件数が多い場合にはレスポンスが悪くなります。
このような場合、キャッシュで対応するという手段もあるのですが、ここでは動的なアソシエーションを紹介します。
前述したように、アソシエーションはモデルの設計時に設定します。しかし、パフォーマンスの向上などの理由から、必要に応じてアソシエーションを設定、または解除することが可能です。このような動的なアソシエーションは次のメソッドで実現します。
- アソシエーションを動的に設定する
Model::bindModel( $params )
Bind model associations on the fly.
Parameters:
array $params - アソシエーションを動的に解除する
Model::unbindModel( $params )
Turn off associations on the fly.
Parameters:
array $params
最後に例を掲載します。
// 本来モデルの設計時に書くことを… $assoc = array("Profile" => array("className" => "Profile", "conditions" => "", "order" => "", "dependent" => true, "foreignKey" => "user_id" ) ); // 必要に応じて指定する $this->User->bindModel(array("hasOne" => $assoc));