2011-04-24 40 views
0

我们有Ebooks HABTM标签。我们尝试选择属于id = 160的标签的电子书。相关型号中包含的意外行为

两者都使用中可容纳的行为,所以在电子书控制器我写了下面的:

$this->Ebook->contain('Tag.id = "160"'); 
$ebooks = $this->Ebook->find('all'); 

根据书中,应返回所需的结果。取而代之的是,所有电子书的清单都会收回。

还要注意,有两个查询运行,第一个返回所有电子书的列表,第二个返回应该返回的电子书。有人有什么主意吗?

在此先感谢

回答

2

是,这个查询说“查找所有电子书,并与他们包括id为160的所有标签”
contain不限制主要结果,仅限于相关结果。

你需要做一个SQL JOIN到HATBM表,并在其过滤你的初步结果,就像这样:

$this->Ebook->bindModel(array('hasOne' => array('EbooksTag'))); 
$this->Ebook->find('all', array(
    'conditions' => array('EbooksTag.tag_id' => 160) 
)); 
+0

谢谢您的回答。这让我的生活更轻松! – 2011-04-25 17:58:26

+0

这可以用作一个更简单的方法来解决我的问题[这里](http://stackoverflow.com/questions/5655977/cakephp-problem-with-habtm-paginate-query)? – Dave 2011-04-26 01:15:21

+0

@Dave HABTM关系很难查询。需要记住的规则是,Cake会自动为belongsTo创建JOIN,并在“主要”查询(包含条件的查询)中拥有一个关系,而hasMany和HABTM关系将单独查询(必要时,因为它们返回的数据多于一行)。有时,明确指定'joins'会更容易,有时绑定模型更容易,有时更容易从其他模型*中查询*。继续玩吧。 :) – deceze 2011-04-26 01:23:34