unbindmodel と bindmodel と
cakephpを触ってると
意味解らないくらいアソシエーションがあって
こらーー! と思いたくなり。。ました。 実体験です。
最初思っていたのは
「ありったけアソシーエション張って、いらんものは毎回はずす」
というスタンスだったのですが、
毎回Modelみて、これもいらん、これもいらん
見たいな事してるのはだるいなと。
で そうなると毎回必要なものだけ bind するほうがいいのではと考えています。
きれいにやる方法があるならですが。。。
作ってるものにもよりますが、毎回関連するレコード全部必要
なんてこと あんまりないんじゃないかなあ。。
しかもアソシーエション先のModelが3つとかになると、そこは全取得以外できない(と思う)し。
と まあ初級cake流コーディングで悩んでいたわけですが、
こんなところに一つの解決方法がありました。
http://bakery.cakephp.org/articles/view/keeping-bindmodel-and-unbindmodel-out-of-your-controllers
コピペで恐縮ですが、
こんな感じでやるとこうですということで
まずモデルの親クラスの AppModel に
class AppModel extends Model {
var $assocs = array();
function expects($array) {
foreach ($array as $assoc) {
$this->bindModel(
array($this->assocs[$assoc][‘type’] =>
array($assoc => $this->assocs[$assoc])));
}
}
…
}
ようは expects というメソッドを作って動的な bind の補助をしてくれるということみたいです。
で Model ではこう宣言
class Title extends AppModel {
var $assocs = array(
’Book’ => array(
’type’ => ‘belongsTo’,
’className’ => ‘Book’,
’foreignKey’ => ‘collection_id’,
),
’Post’ => array(
’type’ => ‘hasMany’,
’className’ => ‘Post’,
’order’ => ‘Post.id DESC’,
)
);
}
$assocs にアソシーエションを突っ込んでいきます。
type のところにアソシエーション部類を突っ込んで、後はクラスや外部キーなど通常のアソシエーションのあれを書く感じ。
最後 Controller で
TitlesController extends AppController {
function list($id) {
//必要なだけアソシーエションを expects する
$this->Title->expects(array(‘Story’, ‘Post’));
$this->Title->Post->expects(array(‘User’));
$this->Title->recursive = 2;
$results = $this->Title->read(null, $id);
}
}
こうやって必要な分だけ簡単に bind することができます。というお話です。
これを俺は求めていた!!
でも今さら変更とか 変更量が多すぎてミリ。。orz
—-追記
http://bakery.cakephp.org/articles/view/an-improvement-to-unbindmodel-on-model-side
こっちにはもうちょっと凝ったやつが乗っています。
違いは
・Cakeでのコーディングの仕方が変わらないようにしている
・デフォルトは全アソシエーションで、必要なバインドを1個でもつければ全部外れる
ということっぽいです。
ようは、
基本全bind たまにイランのがある ->追記のURL
基本bindなし たまにいろいろバインドする ->一番上のURL
かな。
でも基本全bind なら普通に unbindemodel 使えばいーじゃんという話もありますが。。
まあ検証してるわけじゃないので、それはまた別途。