2010-11-24 8 views
1

カテゴリに関連付けられているカテゴリ内の投稿を検索しようとしています。今、私はこれを持っています:HABTMの条件によるレコードの検索

$this->set('posts', $this->Category->Post->find('all', array('conditions' => array('Category.uri' => $uri)))); 

しかし、これは動作していないようです。エラーが表示されます:

Warning (512): SQL Error: 1054: Unknown column 'Category.uri' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 684] 

..<snipped>... 

Query: SELECT `Post`.`id`, `Post`.`title`, `Post`.`uri`, `Post`.`body`, `Post`.`created`, `Post`.`modified` FROM `posts` AS `Post` WHERE `Category`.`uri` = 'holidays'. 

モデル間にHABTMがある場合、そのように取得できるはずです。ただし、表示されたSQLはcategoriesテーブルにJOINしません。

// Category Model 
class Category extends AppModel { 
    var $name = 'Category'; 
    var $hasAndBelongsToMany = array(
     'Post' => array(
      'className' => 'Post' 
     ) 
    ); 
} 

// Post Model 
class Post extends AppModel { 
    var $name = 'Post'; 
    var $hasAndBelongsToMany = array(
     'Category' => array(
      'className' => 'Category' 
     ) 
    ); 
} 

答えて

0

これは、より効率的なコードです:

$this->set('posts', $this->Category->find(
    'first', 
    array(
     'conditions' => array(
      'Category.uri' => $uri 
     ), 
     'contain' => array('Post') 
    ) 
)); 
4

私はあなたがモデル間のHABTM を持っているとき、あなたは ので、同じようにそれを取得することができなければならないことを読みました。

あなたはこれを読んだ場所がわかりませんが、あなたの出所が間違っています。 Cake's documentation of HABTM associationsは、あなたのシナリオとほぼ同じシナリオと、後の結果を達成するために必要な手順を扱います。

My answer to another question about HABTMケーキのORMがどのようにカバーしているのかを理解するために役立つかもしれません。

+0

CakePHPのORMの内部に関するニースの情報が、それがどのように役立つかを見ることができません。 –

+1

なぜなら、Coodは 'categories'と' posts'テーブルで決して 'JOIN'を実行しないので、カテゴリのプロパティによってPostのクエリを制約できない理由を説明するのに役立ちます。それは「魚を与える」よりむしろ「釣りを教える」試みだった。 :-) –

+0

まあ、私はHABTMについてteknoidによってブログ記事を読んだ後にそれを得ました。ありがとう。 –

0

これはうまくいくようです。これを行うより効率的な方法はありますか?

$options['joins'] = array(
    array('table' => 'categories_posts', 
     'alias' => 'CategoriesPosts', 
     'type' => 'LEFT', 
     'conditions' => array(
      'Category.id = CategoriesPosts.category_id' 
     ) 
    ), 
    array('table' => 'posts', 
     'alias' => 'Post', 
     'type' => 'LEFT', 
     'conditions' => array(
      'CategoriesPosts.post_id = Post.id', 
     ) 
    ) 
); 
$options['conditions'] = array(
    'Category.uri' => $uri 
); 
$options['fields'] = array(
    'DISTINCT(Category.uri), Post.*, Category.*' 
); 
$this->set('posts', $this->Category->find('all', $options)); 
+0

このように問題を解決することには、劇的に間違ったことはありません。私が与える唯一の注意は、あなたがケーキのORM抽象を一部破っているということです。 'Model :: bindModel'でこの同じ効果を達成することができます。これは、モデルがあなたのデータソースの仕組みをすべて知っている必要はありません。 –

+0

それは最も簡単な方法ではない –