0

我有一个用户模型和其他 3 个用户模型(HasManys):技能、经验、资格

公共 $hasMany = 数组(

  'Experience' => array(...
  'Qualification' => array(...
  'Skill' => array(...

并且 3 个模型中的每一个都有

public $belongsTo = array('用户' => array(...

Skill、Experience 和 Qualification 都包含一个名为“title”和“description”的字段

通过所有 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 个小时的大部分时间寻找和尝试不同的方法,但实际上无济于事。

干杯!

4

1 回答 1

1

我会使用“关键字”条件过滤每个模型并从中收集用户 ID。在此之后,使用用户 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() 执行它。

于 2013-02-22T23:23:15.670 回答