2011-09-08 57 views
3

此問題與Find conditions like 'NOT EXISTS'類似,只是它與hasMany關係一起工作。查找條件'NOT EXISTS'for has many relationship

的表是:

問題 ID BIGINT ...

回答 ID BIGINT question_id BIGINT ...

的關係是問題的hasMany答案。

該查詢是查找沒有答案的問題ID。

SQL可能看起來像

select id from questions where not exists 
    (select * from answers where answers.question_id = questions.id) 

快速的方法是隻運行一個查詢()的發言,但我想知道是否有一個CakePHP的方式。

我想避免一個NOT IN的情況,因爲這可能導致兩個命中數據庫;一個爲所有問題提供所有問題ID,另一個爲沒有答案的問題提供所有問題ID。

另一種方法可能是將條件數組中的整個where子句作爲單個條目。我只是不確定這是否是最佳做法。

回答

7

而不必改變數據庫,我結束了使用下面的查詢:

$questions = $this->Questions->find('all', array(
    'fields' => array('id'), 
    'conditions' => array('not exists '. 
     '(select id from answers '. 
     'where answers.question_id = '. 
     'Question.id)' 
    ) 
)); 
3

要做到這一點的最好方法是在你的文章表中有一個計數字段。 Cake有一個內置的功能叫做counter cache。

class Post extends AppModel 
{ 
    var $name = "Post"; 
    var $hasMany = array('Answer'=>array('counterCache'=>true)); 
} 

您需要將answer_count添加到您的帖子表中。此列將自動更新添加和刪除關聯記錄。

那麼你的查詢是一個簡單的查找:

$this->Post->find('all', array('conditions' => array('answer_count' => 0))); 

文檔在這裏找到: http://book.cakephp.org/view/1033/counterCache-Cache-your-count

+0

+1用於顯示我從未見過的CakePHP功能。 – Reuben