-
CakePHPでbindされたModelのsave時にunbindModelを使う
投稿 24 2011年6月 by in 開発日誌 with 0 comments
今度のガンダムは低年齢層向けらしいので、ガンダムUCの第4話を待ち望んでワクワクしとこうと思ってるteruchiです。今回もCakePHPネタです。
前回、paginateの時のbindModel()について書きましたが、
http://blog.genieframe.com/?p=721
今回はModel::save()時のunbindModel()です。
bindしてるModelをsaveしようとすると、カラム名にモデル名を付加しないとSQLエラーになることがよくあります。
SQLをデバッグするとわかりますが、UPDATE文に関連モデルをjoinしていることがわかります。
saveAll()とかで、これがうまい具合に効いてくるのだと思いますが、
単純に1レコードだけ更新(もしくは追加)したいのに邪魔です。contain()を使いたくなりますが、save()の時には無関係のようです。
(ソースを追っかけてないので想像)で、unbindModelを使えばこれがサクっと解決します。
Book belongsTo Shop
の状態であれば、
$this->Book->unbindModel(array('belongsTo' => array('Shop')), false); // falseはいらない?$this->Book->save(array(
'name' => 'ユニコーンの日(上) 機動戦士ガンダムUC(1)’,
'auther' => '福井 晴敏',
'publisher' => '角川文庫'));
で行けます。ガンダムUCの第4話ではどうやらあのブライト艦長が出てくるようです。
それでは、また来週もエンターキーで弾幕張りましょう。
よい週末を。 -
ガンダムのアニメ新作が準備中ということでわくわくしながらキーを叩くteruchiです。CakePHPで、モデルをbelongsToとかで関連付けしてて、
2階層目のモデルも一緒に引っ張ってきたい時ってありません?たとえば、
Book belongsTo Shop
Shop belongsTo City
みたいにつながってる状態で、
本(Book)を検索すると本屋さん(Shop)がある街の名前(City.name)も引っ張ってきたいなんてパターン。私はこんな感じでやってます。
// 本モデルに本屋さんモデルを関連付け
$this->Book->bindModel(array('belongsTo' => array('Shop')), false);// 本屋さんモデルに街モデルと店種別モデルを関連付け
$this->Book->Shop->bindModel(array('belongsTo' => array('City', 'Type')), false);// paginateのオプションにcontainを使って取ってくる情報を絞る
$this->paginate = array(
'order' => 'Book.updated DESC',
'contain' => array('Shop.id' => array('City.name', 'Type.name')));$this->set('books', $this->paginate());
ちょっとよけいなのも付いてますが(wポイントはbindModelの第2パラメーターにfalseを指定すること。
これでpaginate()に処理が移っても関連付けが外れなくなります。あとcontainを使ってShop.idを渡すとこ。
DBをフェッチする時の情報を減らします。(プチ減量)SQLをデバッグするとわかりますが、idの一覧を取ってきて、
関連付け先は個別にSELECTしてくれます。(それも問題だけど。。。)一覧で使う場合はあまりおすすめできないかな。。。
ちなみにapp_model.phpで
var $actsAs = array('Containable');
としてるのが前提です。(これ大事)それでは今日も良いコードを。