0

ユーザーモデルと、スキル、経験、資格の 3 つのユーザーモデル (HasManys) があります。

public $hasMany = 配列(

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

3つのモデルはそれぞれ

public $belongsTo = array( 'User' => 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時間の大部分を費やしたので、どんな助けも本当に感謝しています.

乾杯!

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 に答える