2013-02-19 54 views
1

我有3個表格:users,specialities,specialities_usersHABTM和檢索所有型號A沒有某些型號B

User HABTM Speciality 
Speciality HABTM User 
SpecialitiesUser belongsTo Speciality,User 

我也有模型SpecialitiesUser

當我想通過

SpecialitiesUser->find('all' array('conditions' => array('user_id' => $given_user_id)); 

以獲取給定用戶的特色我能做到這一點現在我想獲得該用戶不屬於所有專業。我如何在Cake中做到這一點?

回答

2

下面的代碼$other_specialities變量應該是你想要什麼:

$the_users_specialities = $this->SpecialitiesUser->find('list', array(
    'conditions' => array(
     'SpecialitiesUser.user_id' => $given_user_id 
    ), 
    'fields' => 'SpecialitiesUser.speciality_id' 
)); 

$other_specialities = $this->Speciality->find('all', array(
    'conditions' => array(
     'NOT' => array(
      'Speciality.id' => $the_users_specialities 
     ) 
    ) 
)); 

UPDATE:這是如何使用單個查詢做到這一點:

$db = $this->Speciality->getDataSource(); 

$sub_query = $db->buildStatement(
    array(
     'fields' => array('`SpecialitiesUser`.`speciality_id`'), 
     'table' => $db->fullTableName($this->SpecialitiesUser), 
     'alias' => 'SpecialitiesUser', 
     'conditions' => array('`SpecialitiesUser`.`user_id`' => $given_user_id), 
    ), 
    $this->Speciality 
); 

$other_specialities = $this->Speciality->find('all', array(
    'conditions' => array(
     $db->expression('`Speciality`.`id` NOT IN (' . $sub_query . ')') 
    ) 
)); 
+0

這工作,但我想它在一個單一的查詢 - 這是可能的嵌套SELECT,但我不知道如何做到這一點蛋糕... – user606521 2013-02-23 12:41:24

+0

@ user606521請看我更新的答案。 – 2013-02-24 05:09:01