cakeを使って多対多を実現する方法はこのエントリーで紹介しました。
が、多対多を含む検索をする場合は一筋縄ではいかず結構面倒くさいです。
通常cakeで検索を行う場合、
‘conditions’ =>[‘Item.id’ => 5]
などと書いてあげればOKです。
ただcakeでの多対多の場合、これが通用しません。
上記のケースである特定のtagを含んだitemを
‘conditions’ =>[‘Tag.id’ => 5]
のようにして取り出すことはできません。もちろんTagにnameなどの属性があって検索しようと思っても同様に駄目です。
cakeは多対多のテーブルを直接つなげてみているわけではないようです。
で、その場合、どうするかというとまず関連テーブルをみて、Tag.id=5となっているItem.idを検索し、whereinの要領で、検索を行います。
具体的には下記のようなソースになります。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#関連テーブルをみて特定のtag_idを含んだitem_idを出力する $itemIdTmp = $this->ItemTag->find ( 'list', [ 'fields' => 'item_id', 'conditions' => [ 'ItemTag.tag_id' => $tagId ] ] ); #item_idの値だけが欲しいのとkeyがばらばらで気持ち悪いので #下記のメソッドでそろえる $itemIdArr = array_values( $itemIdTmp ); $params = [ 'Item.id'=> $itemIdArr ]; #もちろんfindなどで同様に使えます。 $items = $this->paginate($params); |