モデルの動的なアソシエーション

CakePHP にはアソシエーションという機能があります。

【公式】 アソシエーション

アソシエーションとはモデル間の依存関係のことで、通常はモデルを設計するタイミングで指定します。次の例は User モデルには Profile モデルと一対一の関係があることを設定しています。

<?php
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

最後に例を掲載します。

<?php
// 本来モデルの設計時に書くことを…
$assoc = array("Profile" =>
                array("className"  => "Profile",
                      "conditions" => "",
                      "order"      => "",
                      "dependent"  => true,
                      "foreignKey" => "user_id"
                )
              );

// 必要に応じて指定する
$this->User->bindModel(array("hasOne" => $assoc));
?>

« 「CakePHP のライブラリ」へ  |  トップへ  |  上の階層へ  |  「CakePHP の暗黙なサニタイズ」へ »

トップページへ戻る / 前のページへ戻る

back to top