Contents
cakeでのJOIN
cakePHPでは基本、hasManyなどの修飾子を使えば、リレーションをとることができますが、検索においてはこれだけで解決しないこともあります。
例えばブログの投稿情報(Post)とコメント(Comment)という関係があるとします。
単純化するためにPostはidのみ、Commentはidとpost_idのみだとします。
言うまでもなくPost(1)-Comment(N)です。
この場合cakePHPでPostに$hasMany=>Commentと書いてあげれば、Postデータを取得するときに、自動的にcommentも取れます。
ただ気を付けてほしいのはJOINではないということです。
SQLのログをみればわかりますが、
- 最初のPostだけを取得
- 次にwhere post_id in ( 実際のPOSTのIDの配列 )でCommentを取得
となります。
なぜなら単純にJOINした場合、Post1行に対し、Commentのレコード分の行数になってしまうからです。
以下のエントリーでこの種の問題を扱いました。
http://skill-up-engineering.com/?p=1275
それでは上記のケースでJOINしてもいい場合はどうすればいいかというとCakeにそもそもJOINをさせる命令があります。
ほとんどSQLに近くなっていますが、下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$params = [ 'joins' => [ [ 'table' => 'comments',//テーブル名 'alias' => 'Comment',//クラス名 'type' => 'LEFT',//LEFT,RIGHTなど 'conditions' => [ //結合条件 'Post.id = Comment.post_id', ] ] ] ]; $record = $this->find ( 'all', $params ); |
上記のようにしてあげればJOINをとることができます。
参考リンク
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html
cakeでのsessionについて
JOINとは関係ないネタになってしまいますが、sessionの有効時間を変更したいときです。
下記のリンクであるようにbootstrap.phpに設定を書いてあげればOKです。