2014-02-19 5 views
0

У меня есть следующий код, который совпадающий с user_id отношений hasMany. Примеры результатов, которые я получаю обратно следующим образом: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?

Это код в Scorecard Модели:

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) Использование присоединяется вместо Containable. С помощью соединений вы обрезаете записи Scorecard, которые не соответствуют условию ScorecardUser. Вы можете прочитать о объединениях here.

2) Продолжайте использовать Containable, если это проще для вас, и сделать петлю, чтобы обрезать те, которые не имеют ScorecardUser

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

3) Есть ли отдельные запросы с Containable. Позовите ScorecardUser, который имеет user_id = $user_id, получить эти scorecard_id с, и сделать еще один запрос, который выбирает системы показателей со статусом 1 и в пределах этих идентификаторов

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

Джойн решение является самым простым один, но не мешало бы знать, альтернативы.

+0

Блестящий ответ. Благодарю. Я всегда делал вариант 2 и ненавидел его, думал, что это просто уродливо. Исследует метод соединения. – Mezzair

Смежные вопросы