通过HABTM中的条件查找记录

时间:2010-11-24 15:12:31

标签: cakephp has-and-belongs-to-many

我正在尝试查找与某个类别相关联的类别中的帖子。现在,我有这个:

$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不会加入类别表。

// 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'
        )
    );
}

3 个答案:

答案 0 :(得分:4)

  

当你有HABTM时,我已经读过了   在模型之间,你应该能够   像这样检索它。

我不知道你在哪里读到这个,但你的来源是错误的。 Cake's documentation of HABTM associations处理与您的情况几乎相同的情景,以及实现您所追求的结果所需的步骤。

My answer to another question about HABTM可能有助于了解Cake的ORM如何在幕后工作。

答案 1 :(得分: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));

答案 2 :(得分:0)

这是更有效的代码:

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