こんにちは。ざっくです。
さて、今回はCakePHPの機能でもあるアソシエーションを紹介します。
モデル同士をつなぐ機能ですが、所謂joinみたいなものです。(正確には違います、SQLが二発発行されたりもするのでパフォーマンスがどうのこうのあったりなかったり。)
モデルに明記しておくことでCakeさんが自動的に関連データを取得してきてくれる夢のような機能となっています。
よく使われるのはhasOne, hasMany, belongsToあたりですので今回はその使い方をざっくりと書きたいと思っ
ていましたが、ネット上にいくらでも書いてあるので今度にします。
今回はプログラムの途中で、新たにアソシエーションを設定したいテーブルなどに、
一時的にアソシエーションを設定する方法を書きたいと思います。
$this->User->bindModel(array( 'hasOne'=>array('アソシエーションしたい先のモデル名', 'アソシエーションしたい先のモデル名2') ) )
このようにあらかじめ明記しておかなくても一時的にUserテーブルとのアソシエーションの設定が可能になります。
複数ある場合は上記のように","で区切ってください。
ただし、この効果も一度のfind()にしか効果がありません。
引き続き有効にしたい場合は第二引数にfalseを設定してあげてください。
$this->User->bindModel(array( 'hasOne'=>array('アソエーションしたい先のモデル名') ), false );
逆に、一時的にUserテーブルとのアソシエーションの設定を解除したい場合は以下の方法で可能です。
$this->User->unbindModel(array( 'hasOne'=>array('アソエーションしている先のモデル名') ) );
ある程度大きなシステムになるとUserテーブルやProfileテーブルなどのユーザーに紐づくようなテーブルはアソシエーションの設定をされてると思いますが、Profileテーブルの情報だけ取得したい時などに有効になります。
上記の方法も同じく第二引数にfalseを与えることで永続的に設定を解除したままになります。
またhasOneを例に記述しましたがhasManyやbelongsToも同じように解除することが可能ですし、一時的に新たにモデル同士のアソシエーションを設定することも可能です。
次回は、基礎編としてfind()のあれこれを書こうと思ってます。
が、変わるかもしれませんので期待はしないでください!