过滤可包含的模型结果

时间:2011-10-03 20:15:08

标签: cakephp search filter tags containable

我正在尝试使用以下代码行来过滤所有具有某些(不相关)条件的帖子,标签为“who”

$ com = $ this-> Post-> find('all',array('conditions'=> $ conditions,'contains'=>'Tag.tag =“who”'));

然而,不是结果只是带有标签的帖子,我得到的每个帖子都带有空标签数组,用于那些没有标签“who”的帖子。

我知道我的问题已经出现过了,但是发布的解决方案并没有使用我的代码。 我试过在这里修改我自己的代码: http://web-development-blog.co.uk/2010/09/14/cakephp-habtm-find-with-conditions-and-containable-behavior/,但是我收到一条SQL错误,指出在on子句中找不到“Tag.post_id”。

请帮忙。

尝试从所选链接实现代码时出现错误消息:

SELECT `Post`.`id`, `Post`.`title`, `Post`.`body`, `Post`.`created`,       `Post`.`modified`, `Tag`.`id`, `Tag`.`tag`, `Tag`.`created`, `Tag`.`modified` FROM `posts` AS `Post` LEFT JOIN `tags` AS `Tag` ON (`Tag`.`post_id` = `Post`.`id`) WHERE `Tag`.`tag` = 'who'    1054: Unknown column 'Tag.post_id' in 'on clause'            

这是由于使用它引起的:

$this->Post->bindModel(array('hasOne' => array('Tag')));
$this->Post->contain(array(
  'Tag'
));
$com=$this->Post->find('all', array(
  'conditions'=>array('Tag.tag'=>'who') 
)); 

1 个答案:

答案 0 :(得分:0)

你的错误是你正在使用bindModel而不是说外键或任何东西,你应该在模型中建立关联,并在严格需要时使用这种即时方法。

你需要告诉蛋糕哪个非蛋糕的外键会使用默认值,在你的情况下它会尝试Tag.post_id。

另外你应该使用一个有很多联想或者至少我是这么认为的。我说这是因为我认为帖子可能有多个标签。

在模型中执行asociation并删除此行

$ this-> Post-> bindModel(array('hasOne'=> array('Tag')));

它应该完美地运作

或者你可以动态地使用正确的参数进行关联阅读cookbook为此,显示如何放置类名的示例是你寻找的,只需添加其他属性

编辑:

抱歉,读错了...有很多关联不做连接所以你必须使用包来指定条件或动态添加条件,这里是你的代码应该如何照顾添加包含

的条件
$contain = array(
  'Tag' => array(
       'conditions'=> array('Tag.tag'=>'who') 
   )
);
$com=$this->Post->find('all', array(
  'contain'=>$contain 
));

记住包含条件覆盖关联中的条件!!如果你想要有额外的条件,你必须立即添加它们:

$this->Post->hasMany['Tag']['conditions'] += array('Tag.tag'=>'who');

请记住,动态关联仅适用于该实例。

此外,您可以为不同类型执行hasmany别名(记住始终定义classname和foreignkey)。

希望这次有效,如果不只是评论看它修复;)