こんにちは。ざっくです。

 

さて、今回は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()のあれこれを書こうと思ってます。

が、変わるかもしれませんので期待はしないでください!

お見積いたします。どんなことでも、お気軽にご相談ください。

お客様のご要望とご予算に応じて最適なソリューションをご提案いたします。
VRの開発やアプリ開発以外でも、ぜひ一度ご相談ください。