我有一个用户模型和其他3个用户模型(HasManys):技能,经验,资格
public $ hasMany = array(
'Experience' => array(... 'Qualification' => array(... 'Skill' => array(...
并且3个模型中的每一个都有
public $ belongsTo = array( '用户'=>阵列(...
技能,经验和资格都包含一个名为“标题”和“描述”的字段
通过所有3个模型的每个 OR “标题”和“描述”以及符合条件的返回用户进行外卡搜索(%search%)的最佳方法是什么?
我很难理解它,无论我搜索什么,都与我想要的相反或者只是不相关。
有没有人有任何想法如何实现这样的任务?
到目前为止我有这样的事情:
$cond=array('OR'=>array(
"Skills.name LIKE '%$keyword%'",
"Experiences.name LIKE '%$keyword%'",
"Experiences.description LIKE '%$keyword%'")
);
$conditions = array('conditions'=>$cond);
$list = $this->User->find('all',
array('conditions') => $cond);
$list = $this->User->find('all', array('recursive'=> 1, 'conditions'=> $cond));
任何帮助都会受到赞赏,因为我花了5个小时的时间来寻找并尝试不同的方法,实际上没有用。
干杯!
答案 0 :(得分:1)
我会使用'keyword'条件过滤每个模型并从中收集用户ID。在此之后,使用user-id列表返回用户列表。喜欢的东西;
// get distinct user-ids and simplify the results array with Hash::extract()
$userIds = Hash::extract($this->User->Skill->find('all', array(
'fields' => array('DISTINCT Skill.user_id'),
'conditions' => array('Skill.name LIKE ?' => "%$keyword%"),
'recursive' => -1
)), '{n}.User.id');
// repeat for the other tables, and merge the user-ids
.....
// Use the list of user-ids for retrieve matching users
$this->User->find('all', array('conditions' => array('User.id' => $userIds)));
但是,根据用户数量,这可能会返回一个巨大的用户ID列表,这可能并不理想。最后,始终可以使用自定义查询并使用model-> query()执行该操作。