2010-12-02 29 views
0

私はLandmarksというテーブルとHABTM関係を持つCategoriesというテーブルをお互いに持っています。私は、次のコードで、特定のランドマークのためのすべてのカテゴリを取得しようとしています:私のCakePHP HABTMクエリで何が間違っていますか?

$this->set('selected_categories', $this->Category->find('list', 
    array('contain'=>array(
     'Landmarks'=>array(
      'conditions'=>array('Landmark.num'=>7) 
))))); 

私は(デバッグレベル2にプリントアウトなど)は、このから得られるデータベースクエリをテストしてみた、やっています正しい結果、すなわちカテゴリーのサブセット。しかし、ビューでvar_dump $ selected_categoriesを実行すると、代わりにすべてのカテゴリのリストが表示されます。

私はここで何かが分かりませんか?

ETA:上記のクエリが機能していると私はうそを言いました。ページ上の他のものが、私が望むSQLクエリを生成しています!これは:

SELECT `Categories`.`num`, `CategoriesLandmark`.`category_num`, 
    `CategoriesLandmark`.`landmark_num` 
FROM `categories` AS `Categories` JOIN `categories_landmarks` 
AS `CategoriesLandmark` ON (`CategoriesLandmark`.`landmark_num` = 7 
AND `CategoriesLandmark`.`category_num` = `Categories`.`num`) WHERE 1 = 1 

答えて

1

検索タイプを 'list'として指定すると、Containableビヘイビアと互換性がありません。

function fetchListByLandmarkNum($landmarkNum) { 
    return $this->find('list', array(
     'joins' => ... 
    )); 
} 

そして、コントローラからそれを呼び出す:

$selectedCategories = $this->Category->find('list', array(
    'joins' => array(
     array(
      'table' => 'categories_landmarks', 
      'alias' => 'CategoriesLandmark', 
      'type' => 'inner', 
      'conditions' => array("CategoriesLandmark.category_id = Category.id") 
     ), 
     array(
      'table' => 'landmarks', 
      'alias' => 'Landmark', 
      'type' => 'inner', 
      'conditions' => array(
       "CategoriesLandmark.landmark_id = Landmark.id", 
       'Landmark.num' => 7 
      ) 
     ), 
    ) 
)); 

私は理想的に直接そうのようなCategoryモデルにこれを置きます:

使用ではなく、これを達成するために参加します

$selectedCategories = $this->Category->fetchListByLandmarkNum(7); 
$this->set(compact('selectedCategories')); 

常にあなたのモデルを太くする私たちのコントローラはスキニーです。他の場所でこの機能を再利用できるようになりました。 :)


すべてのカテゴリが返されている理由は、条件は、関連するランドマークのモデルに適用されていることです。このContainableクエリの結果は、すべてのカテゴリをフェッチし、num = 7を満たすLandmarkモデルのみを返します。Landmarkモデルが条件を満たしているカテゴリのみを返すと解釈するべきではありません。

+0

ええ、私の質問がうまくいっていると私はうそを言いました。私の質問を再編集するつもりです。私は「リスト」を「すべて」に変更しようとしたと思うが、確かにもう一度やり直すだろう! – thesunneversets

+0

私は実際に自分の答えを編集しました。結合を使用してみてください。 「すべて」に設定するとどちらもうまくいかないでしょう。理由を説明するために私の答えを再編集します。 – RabidFire

+0

本当にうまくいっています...コントローラーから私のモデルへの手入れを助けてくれてありがとう! – thesunneversets

関連する問題