2014-02-19 3 views
0

hasMany 관계의 user_id와 일치하는 다음 코드가 있습니다. 찾은CakePHP 빈 제거 hasMany 결과

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)); 

} 

답변

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) 수행 별도의 쿼리가없는 사람을 트리밍 루프를 않습니다. 그 scorecard_id의를 얻을 user_id = $user_id이있는 ScorecardUser 가져 오기 및 상태 1로 스코어 카드를 가져 오는 또 다른 쿼리를 수행하고 그 식별자 내에서

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

이 솔루션은 가장 쉬운 일이지만, 알고 다치게하지 않습니다 가입 대안.

+0

화려한 대답. 감사. 나는 항상 옵션 2를했고 그것을 싫어했다. 단지 추악했다고 생각했다. 대신 조인 방법을 조사합니다. – Mezzair

관련 문제