我正在为我的项目中的消息搜索操作,这里有两个模型:Msgcontent和Msgblock.Relationship是Msgblock hasMany Msgcontent。我想要做的是获取所有包含Msgcontent的Msgblock记录和一些搜索keyword.My代码如下:
if($keyword)
{
$conditions['and'] = array(
'Msgcontent.content LIKE'=>'%'.$keyword.'%',
'Msgcontent.content <>'=>''
);
$results = $this->Msgblock->Msgcontent->find('all',array('group'=>array('Msgblock.chatsessionid'),'conditions'=>$conditions));
}
这似乎不是一项好工作。有没有更好的解决方案?谢谢。
答案 0 :(得分:8)
如果没有使用适当的JOIN编写自己的SQL查询,这是使用两个查询在Cake中执行此操作的最简单方法:
$ids = $this->Msgblock->Msgcontent->find('all', array(
'fields' => array('Msgcontent.msgblock_id'),
'recursive' => -1,
'conditions' => ...
));
$this->Msgblock->find('all', array(
'conditions' => array('Msgblock.id' => Set::extract('/Msgcontent/msgblock_id', $ids))
));
答案 1 :(得分:1)
您可以将bindModel与条件一起使用,例如:
$this->Msgblock->bindModel(
array(
'hasMany' => array(
'Msgcontent' => array(
'className' => 'Msgcontent',
'conditions' => array(
'Msgcontent.content LIKE' => "%$keyword%"
)
)
)
);
然后您可以无条件地使用您的查找,因为它已在绑定时完成。
答案 2 :(得分:0)
这是使用Cake的Containable行为的完美情况,如multidèria's excellent answer中对very similar question的讨论。将Containable
添加到您的Msgcontent模型$actsAs
,或者动态附加行为。
答案 3 :(得分:-1)
在条件中设置子查询,搜索hasMany表并返回计数(如果找到)。
(从YOUR_HAS_MANY_TABLE中选择计数(id),其中YOUR_HAS_MANY_TABLE.foreign_key = MAIN_TABLE.id,其中YOUR_HAS_MANY_TABLE.field_to_search ='%SEARCH%')&gt; 0
效率并不高,但通过适当的索引,它是一种可以完成工作的解决方案。