2012-08-04 65 views
1

我在cakePHP中有兩個表。CakePHP嵌套兩個select查詢

competencies 
------------ 
id 
name 

competenceRatings 
----------------- 
id 
competence_id 
user_id 
rating 

我需要一種方法來寫在蛋糕的方式下面的查詢:

SELECT * FROM能力WHERE ID NOT IN(SELECT competence_id FROM competence_ratings WHERE僱員= $用戶id)

有人請幫我!!

我做了什麼,纔去這個子查詢方法:

我試圖competencies-> hasMany-> competenceRatings,competenceRatings-> belongsTo->競爭力的關係。

$competencies = $this->Competence->CompetenceRating->find('all',array('CompetenceRating.user_id' => $userId,'CompetenceRating.competence_id !=' => 'Competence.id')); 

我希望能夠獲得用戶沒有對能力評分表進行任何評分的能力的名稱。即,我需要能力表中沒有條目的能力表中的名稱列表(對於給定的user_id)。

編輯

我試着表中還加入:

$options['joins'] = array(
      array(
       'table' => 'competence_ratings', 
       'alias' => 'CompetenceRating', 
       'type' => 'LEFT OUTER', 
       'conditions' => array(
        'Competence.id = CompetenceRating.competence_id' 
       ) 
      ) 
     ); 
$options['conditions'] = array('CompetenceRating.employee_id' => $employee['Employee']['id']); 

$competencies = $this->Competence->find('all',$options); 
+0

你到目前爲止做了什麼? – mark 2012-08-04 18:33:31

+0

我正在談論實際的代碼。而不是隻發佈預期的結果,你也應該發佈你到目前爲止的代碼。你可以編輯並完成你的問題。 – mark 2012-08-04 18:44:19

+0

你再問同樣的問題2或3小時你問「CakePHP表加入兩個表問題」這個問題 – 2012-08-04 18:44:50

回答

2

你可能不得不使用子查詢():

$subqueryOptions = array('fields' => array('competence_id'), 'conditions' => array('employee_id'=>$user_id)); 
$subquery = $this->Competence->CompetenceRating->subquery('all', $subqueryOptions); 

$res = $this->Competence->CompetenceRating->find('all', array(
    'conditions' => array('id NOT IN '. $subquery) 
)); 

的子查詢的來源是在這裏: https://github.com/dereuromark/tools/blob/2.0/Lib/MyModel.php#L405 你需要把它放在你的AppModel.php

但我認爲子查詢是沒有必要的。你也許可以做一個單一的,易於查詢出來的:

$this->Competence->CompetenceRating->find('all', array(
    'group' => 'competence_id', 
    'conditions' => array('NOT' => 'employee_id'=>$user_id)), 
    'contain' => array('Competence') 
)); 

不要忘記包括通過「包含」如果你有遞歸設置爲-1能力。

+0

非常感謝!我希望在單個查詢中做到這一點,但我無法做到這一點。我怎樣才能讓它發生?你不介意看看我的編輯? – Ivin 2012-08-04 19:50:53

+0

我試過你的第二種方法。這就是它的作用:SELECT'CompetenceRating'.'id','CompetenceRating'.'competence_id','CompetenceRating'.''user_id','CompetenceRating'.'ratinging','CompetenceRating'.'remarks','CompetenceRating' .'dated','CompetenceRating'.'created','CompetenceRating'.'modified' FROM'appraisal'.'competence_ratings' AS'CompetenceRating' WHERE NOT('user_id' ='28')GROUP BY competence_id – Ivin 2012-08-04 20:12:38

+0

我想要能力表字段! – Ivin 2012-08-04 20:13:01