cakephp - 搜索整个模型和HasManys并使用通配符

时间:2013-02-22 17:06:08

标签: php mysql cakephp search

我有一个用户模型和其他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个小时的时间来寻找并尝试不同的方法,实际上没有用。

干杯!

1 个答案:

答案 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()执行该操作。