2013-06-29 48 views
1

我有一個模型,它有一個不需要的belongsTo關係。CakePHP:屬於空值

Banana belongsTo Basket 
banana.basket_id can be null 

這意味着香蕉可以屬於一個籃子,但不必。

保存操作Banana->save(array('Banana' => array('basket_id' => null, 'weight' => 50)));工程確定,但是當我閱讀,我得到這樣的結果:

array(
    'Banana' => array('id' => 10, 'basket_id' => null, 'weight' => 50), 
    'Basket' => array('id' => null, 'bannana_count' => null) 
) 

當然,我可以在一個afterFind篩選出來的,但我寧願看到有在沒有籃如果basket_id爲null,則返回結果數組。該怎麼辦?

使用CakePHP 2.3.6。

回答

-1

在關聯中使用type鍵強制INNER連接而不是默認的LEFT連接。

class Banana extends AppModel { 
    public $belongsTo = array(
     'Basket' => array(
      'type' => 'inner', 
      'conditions' => array('Banana.basket_id = Basket.id') 
     ) 
    ); 
} 

文檔:http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongsto

+0

我已經創建了一個單元測試來檢查這個。如果你進行INNER JOIN,你最終會得到一個空的結果集(和SQL中一樣)。你可以在這裏看到測試:https://gist.github.com/dizyart/5892935 –

+0

我添加了條件到我的答案,如果這仍然無法正常工作,請張貼正在生成的SQL查詢。 – Costa

+1

如果沒有匹配,INNER不會顯示任何內容。我認爲他會認爲不存在的關聯不應該顯示空列.. – giuseppe

3

由於示範使用LEFT JOIN與屬於關聯關係檢索相關的模型數據,相關字段的值,你會得到什麼的選擇結果用空外國鍵值 - 每列中的空值。

解決方法是在afterFind回調中從結果數組中過濾這些相關模型。

//Banana model 

public function afterFind($results, $primary = false){ 
    if (isset($results['Basket']) && $results['Basket']['id'] === null) { 
     unset($results['Basket']); 
    } 
    if (isset($results[0])){ 
     foreach($results as $key => $value){ 
      if (isset($value['Basket']) && $value['Basket']['id'] === null){ 
      unset($results[$key]['Basket']); 
      } 
     } 
    } 

    //If you forget this, nothing will happen... 
    return $results; 
} 

當然,你可能需要將其設置爲false,而不是它解封,或許一個空數組的,但因爲我發現沒有約定此,建議者居多。