我有以下代码与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));
}
答案 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));
加入解决方案是最简单的解决方案,但了解替代方案并没有什么坏处。