Tech Racho エンジニアの「?」を「!」に。
  • 開発

hasAndBelongsToManyで検索する

CakePHPでfindする際、belongsToしているオブジェクトを条件にすることができます。

//例:datas → categories で、dataはcategoryに属している(data belongsto category)
$datas = $this->Data->find('all', array(
    'conditions' => array('Category.id' => 5)
));

しかし、hasManyしているものに関しては、そのまま実行すると unknown column と怒られてしまいます。
hasManyでは、デフォルトでJOINされないためです。

hasAndBelongsToManyでも、同じことが発生します。

これを回避するには、明示的なJOINを実行する必要があります。

たとえば、データが複数のカテゴリに属するように、data hasandbelongstomany category にした場合、以下のように指定します。

//例:datas← categories_datas→ categories で、
//hasAndBelongsToManyしている
$datas = $this->Data->find('all', array(
    'joins' => array(array(
        'type' => 'LEFT',
        'alias' => 'CategoriesData',
        'table' => 'categories_datas',
    )),
    'conditions' => 'CategoriesData.data_id = Data.id'
));

joinsは配列なので、いったん取得して[]演算子で追加するか、このように最初から二重の配列で指定してあげる必要があります。
(もちろん、既存のJOINを消してしまわないかチェックしつつ)

ところで、hasAndBelongsToManyでググると、途中で「破産」がたっぷり出てきた後、↓のようになって若干悲しくなりますね・・・

hasAndBelongsToManyで検索する途中

hasAndBelongsToManyで検索する途中

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。