2013-02-17 105 views
2

在我的應用程序中,我有一個Burger模型,一個Joint模型和一個Location模型。在CakePHP中使用關聯關聯條件進行過濾

關節有許多漢堡,並有許多地點。

我想要做的是過濾漢堡兩種方式:基於評級,也取決於它們是否屬於具有與條件相匹配的位置的聯合,在此情況下爲城市。

下面是我嘗試過,但她沒有workey:

$burgers = $this->Burger->find('all', array(
    'conditions' => array('Burger.official_rating !=' => 0), 
    'contain' => array(
     'Joint', 
      'Joint.Location.conditions' => array(
       'Location.city' => 'Toronto' 
      ) 
    ), 
    'order' => array('Burger.official_rating DESC'), 
    'limit' => 10 
)); 

Joint.Location.conditions似乎沒有任何效果。

編輯:現在使用連接,但我不確定這是否是最有效的方式(請注意,我必須添加一個Contain子句,以確保關聯數據已返回到結果中)。

$options['joins'] = array(
    array('table' => 'joints', 
     'alias' => 'Joint1', 
     'type' => 'inner', 
     'conditions' => array(
      'Joint1.id = Burger.joint_id' 
     ) 
    ), 
    array('table' => 'locations', 
     'alias' => 'Location2', 
     'type' => 'inner', 
     'conditions' => array(
      'Location2.joint_id = Burger.joint_id' 
     ) 
    ) 
); 

$options['conditions'] = array(
    'Location2.city' => 'Toronto', 
    'Burger.official_rating !=' => 0 
); 

$options['order'] = array(
    'Burger.official_rating DESC', 
); 

$options['limit'] = 10; 

$options['contain'] = array(
    'Joint','Joint.Location' 
); 

$burgers = $this->Burger->find('all', $options); 

回答

2

問題:

這是一個很常見的問題的人有,但很容易,只要你明白反對它包含的項目,你不能限制基於條件的主要發現模型彌補。

不能這樣做的原因是因爲執行一個包含實際上在表上創建單獨的查詢,而不是JOIN創建單個查詢。

解決方案:

你在這種情況下,最好的辦法是使用CakePHP JOINs

在某些情況下(不是你的),使用JOIN的替代方法是更改​​正在查詢的模型。如果您只需要一個條件,那麼您可以使用條件而不是包含內容的條件將查找更改爲模型,並按相反順序包含該條件。

+0

你的答案幫助!我在問題中添加了我的解決方案。它正在工作,但我不確定的一件事是我是否需要「包含」來實際將數據包含在結果中。 – 2013-02-18 00:44:05

+0

@BenjaminAllison - 你根本不應該使用包含 - 只需指定從不同模型'fields'=> array(...')所需的字段,它將返回你想要的數據 – Dave 2013-02-18 03:39:09

+0

但是當然!非常感謝。 – 2013-02-18 05:48:01