[CakePHP] hasAndBelongsToMany の関連テーブルの条件で絞り込み検索

2010-11-5 22:58
このエントリーをはてなブックマークに追加

CakePHP は基本的に SQL を直接書くことなくデータを取り扱いできますが、複雑な条件の絞り込み検索などは、簡単にいかないこともあります。

今回は嵌ったのは、hasAndBelongsToMany で関連づけられた Photos と Tags のテーブルがあり、特定のタグ名を持つ写真を検索するという場合。SQLなら簡単に書けるケースでも CakePHP だと戸惑ってしまいます。

例えば Photo Tag という二つの Model を hasAndBelongsToMany (HABTMと略される)で結びつけます。このとき関係テーブルに対応する PhotosTag というモデルがあります。

この結びつきのままで conditionsTag.Name => 'hoge' などと書いてもうまくいきません。

結局、hasAndBelongsToMany (HABTM) The Cookbookの記述を参考に Model の bindModel を使用することにしました。

$this->Photo->bindModel(array(
    'hasOne' => array('PhotosTag', 
            'FilterTag' => array(
                'className' => 'Tag',
                'foreignKey' => false,
                'conditions' => array('FilterTag.id = PhotosTag.tag_id')
            )
        )
    )
);
$conditions = array('FilterTag.name' => $keyword);
$data = $this->find('all', array('conditions' => $conditions));

これで期待通りの動作となります。生成された SQL も期待通りのものです。

ちなみに同じことを実現する方法として、CakePHP 1.2 以降の コンテイナブルというものもあります。こちらの方が PHP のコード簡潔なのですが、生成される SQL が非常に非効率であり、格納されるデータの形も扱いづらかったので、採用に至りませんでした。

CakePHP はやりたいことを調べるのに結構時間がかかってしまいますが、こういったノウハウが蓄積されてくると開発スピードが上がりますね。

  • ブックマーク : アクセス: 14,352回
  • カテゴリー : PHP
  • キーワード :

コメントはまだありません

No comments yet.

Sorry, the comment form is closed at this time.

33 queries. HTML convert time: 0.063 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2017 @ futuremix.org ログイン