【问题标题】:CakePHP: belongsTo with null valueCakePHP:belongsTo 具有空值
【发布时间】:2013-06-29 18:22:28
【问题描述】:

我有一个模型,它有一个不需要的 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。

【问题讨论】:

    标签: cakephp model foreign-keys relational-database belongs-to


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在您的关联中使用 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

      【讨论】:

      • 我创建了一个单元测试来检查这一点。如果进行 INNER JOIN,最终会得到一个空结果集(与 SQL 中相同)。你可以在这里看到测试:gist.github.com/dizyart/5892935
      • 我在答案中添加了条件,如果仍然不起作用,请发布正在生成的 SQL 查询。
      • 如果不匹配,INNER 不会显示任何内容。我认为他认为不存在的关联不应该显示空列..
      • @giuseppe "但如果 basket_id 为空,我宁愿看到结果数组中没有篮子"
      • 但是 type=>inner 也会隐藏 Banana
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多