CakePHP删除空hasMany结果

时间:2014-02-19 20:34:22

标签: cakephp

我有以下代码与hasMany关系的user_id匹配。我得到的样本结果如下:

array(
(int) 0 => array(
'Scorecard' => array(
        'id' => '529e400a-6e98-4471-8465-04470a0a0a0a',
        'course_id' => '0a111cdd-4732-11e3-98e6-080027f3add4',
        'flag_count' => '0',
        'status' => '1',
    ),
    'ScorecardsUser' => array(
        (int) 0 => array(
            'id' => '529e400a-8a30-4e63-b6c6-04470a0a0a0a',
            'user_id' => '527d5dff-e9a0-40c0-8512-04510a0a0a0a',
            'scorecard_id' => '529e400a-6e98-4471-8465-04470a0a0a0a',
            'gross_score' => '50',
            'points_score' => '0',
            'match_score' => '0',
            'handicap' => '0',
            'team' => '0',
            'created' => '2013-12-03 20:33:14',
            'modified' => '2013-12-03 20:33:14'
        )
    )
),
(int) 1 => array(
    'Scorecard' => array(
        'id' => '52b0c20d-61e8-425d-9b8c-05d40a0a0a0a',
        'course_id' => '0a111cdd-4732-11e3-98e6-080027f3add4',
        'flag_count' => '0',
        'status' => '1',
    ),
    'ScorecardsUser' => array()
),

它找到的第一个结果正是我所期望的。但是,user_id与第二个不匹配 - 因此ScorecardsUser的结果为空。但是,第二个结果是否应该出现,因为它与hasMany模型上的条件不匹配?

这是记分卡模型中的代码:

public function getUsersScoreCards($user_id = null) {

    $this->bindModel(array(
        'hasMany' => array(
            'ScorecardsUser' => array(
                'conditions' =>array(
                    'ScorecardsUser.user_id' => $user_id
                )
            )
        )
    ));

    $this->recursive = 1;
    $this->Behaviors->load('Containable');
    $contain = array('ScorecardsUser');

    return $this->find('all', array('conditions' => array('Scorecard.status' => 1), 'contain' => $contain));

}

1 个答案:

答案 0 :(得分:2)

即使与相关型号条件不匹配,结果也会返回。当您使用Containable时会发生这种情况。这就是蛋糕的行为方式。

如果它困扰你,你有3种方法可以解决它。

1)使用连接而不是包含连接。使用联接,您将删除与ScorecardUser条件不匹配的记分卡记录。您可以阅读有关联接here的信息。

2)如果对你来说更容易继续使用可包含的东西,并做一个循环来修剪那些没有ScorecardUser的东西

foreach($the_find_array as $i => $data)
  if (empty($data['ScorecardUser']))
      unset($the_find_array[$i]);

3)使用可包含的单独查询。获取具有user_id = $user_id的ScorecardUser,获取那些scorecard_id,然后执行另一个查询以获取状态为1且在这些ID中的记分卡

$this->find('all', array('conditions' => array('Scorecard.status' => 1,
                                               'Scorecard.id' => $ids_of_filtered_scorecardusers), 'contain' => $contain));

加入解决方案是最简单的解决方案,但了解替代方案并没有什么坏处。