1

我有一个模型,它具有不需要的 belongsTo 关系。

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 为空,我宁愿看到结果数组中没有 Basket。该怎么办?

使用 CakePHP 2.3.6。

4

2 回答 2

3

由于模型使用 LEFT JOIN 来检索具有 belongsTo 关系的相关模型数据,因此相关字段的值正是您在具有空外键值的选择结果中获得的值 - 每列中的空值。

解决方法是在 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而不是取消设置它,或者可能是一个空数组,但由于我没有发现这方面的约定,因此非常欢迎提出建议。

于 2013-06-29T22:12:12.460 回答
-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

于 2013-06-29T21:44:30.450 回答