add to hatena hatena.comment (1) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 1

CakePHP HABTMモデルの検索

HABTMで関連付けされたテーブルを検索条件に加えたい場合、一回のfindメソッドで取得しようとすると、joinの設定やグループ化で面倒な実装が必要になってきます。

データ量にもよりますが、

1)関連テーブルを先に検索し、ID配列を取得
2)ID配列を検索条件に追加

としたほうが簡単に実装できるケースが多そうです。

例として、以下のモデルを使って検証します。
(料理が複数の食材と関連付けされている)

料理テーブル(モデル名:Cooking)
- id
- name
- category_id

食材テーブル(モデル名:Food)
- id
- name

料理-食材関連付けテーブル(モデル名:CookingFood)
- id
- cooking_id
- food_id

料理のカテゴリID=3 AND 食材ID=5 で検索する場合では、
まず、関連付けテーブルから対応する食材を含む料理IDを取得します。

PHP:
  1. $dataList = $this->Cooking->CookingFood->find('list', array(
  2.     'fields' => array('CookingFood.cooking_id'),
  3.     'conditions' => array('CookingFood.food_id' => 5),
  4. ));

次に、取得した料理IDのリストを検索条件に含めます。

PHP:
  1. $results = $this->Cooking->find('all', array(
  2.     'conditions' => array(
  3.         'Cooking.category_id' = 3,
  4.         'Cooking.id' = $dataList,
  5.     ),
  6.     'order' => 'Cooking.id',
  7. ));

Paginateが必要な場合は、後半の部分を

PHP:
  1. $this->paginate = array(
  2.     'limit' => 10,
  3.     'order' => 'Cooking.id',
  4. );
  5. $results = $this->paginate($this->Cooking, array(
  6.         'Cooking.category_id' = 3,
  7.         'Cooking.id' = $dataList,
  8. ));

とすればOK。

サンプルの動作イメージはこちらになります。
サンプルのソースコードは こちらからダウンロードできます。

関連するその他の記事

Comments

Leave a Reply