CakePHPのbindModelとunbindModel

Kazuya Takato

Kazuya Takato

CakePHPで各々のModelにアソシエーションを設定してて、

検索で使いたくないときはunbindModelを使うとはずせる。

Modelに定義してないけど、今回だけアソシエーションにしたい場合はbindModelで設定できる。

それは知っていたんだけど、unbindModelとbindModelを使用して、paginateを使用したら検索がうまくいかなかった。

$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));

$result = $this->paginate('Model');

paginateはcountのSQLを実行した後、中身を取るSQLを実行してくれるんだけど、

ログを見たらcountのSQLには指定したunbindModelとbindModelは適用されてるのだけど、2回目のSQLにはされてなかった。

試しに2回unbindModelとbindModelを実行したらうまくいったよ。

// 2回Modelに設定してやる
$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));
$this->Model->unbindModel(array('hasOne'=>array('Model_2')));
$this->Model->bindModel(array('hasOne'=>array('Model_3')));

$result = $this->paginate('Model');

しかし、絶対もっといい方法があるよなぁとか思いつつ、model.phpのソースをみたら、

function bindModel($params, $reset = true)

function unbindModel($params, $reset = true)

引数に$resetなるものが。

コメントはIf $reset is false, association will not be reset to the originals defined in the model

$resetにfalseを渡せばモデルで定義されたアソシエーションに戻りませんよって感じかな。

$this->Model->unbindModel(array('hasOne'=>array('Model_2')),false);
$this->Model->bindModel(array('hasOne'=>array('Model_3')),false);

$result = $this->paginate('Model');

結局、$resetにfalseを渡してあげたらうまくいった。

そりゃ当然想定されてるよね。

今までページネーションが必要な時に、bindModelとかを使用したことがなかったんだなぁ。

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

Kazuya Takato
Kazuya Takato 取締役 COO 兼 CTO / DX事業本部長 / 高遠 和也

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。現在は、取締役COO兼CTO、DX事業本部長として、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担う。

このメンバーの記事をもっと読む
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL