2010-12-09 2 views
0

У меня следующий вопрос.Содержит поведение, условия и пустой массив

Существует часть кода:

 $result = $this->find('all', array(
      'contain' => array(
       'User' => array(
        'fields' => 'id', 
        'conditions' => array(
         'id' => $user_id 
        ) 
       ) 
      ), 
      'fields' => 'url' 
     )); 

Эта находка() вызывается в методе класса модели проекта, и я хочу, чтобы получить только проекты, где User.id равны некоторый идентификатор пользователя передается в мой метод. Пользователь HABTM Project и Project HABTM Пользователь.

Но после выполнения у меня есть следующий:


app/views/projects/index.ctp (line 1) 

Array 
(
    [0] => Array 
     (
      [Project] => Array 
       (
        [url] => http://purpled.biz 
        [id] => 1 
       ) 

      [User] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [ProjectsUser] => Array 
           (
            [user_id] => 4 
            [project_id] => 1 
            [projects_users_role_id] => 0 
           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [Project] => Array 
       (
        [url] => http://google.com 
        [id] => 2 
       ) 

      [User] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [ProjectsUser] => Array 
           (
            [user_id] => 4 
            [project_id] => 2 
            [projects_users_role_id] => 0 
           ) 

         ) 

       ) 

     ) 

    [2] => Array 
     (
      [Project] => Array 
       (
        [url] => http://test.com 
        [id] => 3 
       ) 

      [User] => Array 
       (
       ) 

     ) 

) 

Как вы видите, есть последний массив с пустыми [User] массива, так как можно исключить этот пустой массив (весь [2] массив Я имею в виду) без использования foreach/if blocks? Я знаю, что использование bindModel будет делать все, но это не для моего вопроса;) Итак, как?

ответ

2

Размещение ваших условий внутри клавиши «содержать» будет фильтровать результаты в пределах определенной модели.

Получение правильных данных Я ответил на вопрос, прежде чем очень похож на этот here. Вам просто нужно будет заменить модели, упомянутые там, своими собственными моделями. Если у вас есть проблемы с пониманием ответа, сообщите нам.

Советы для текущей структуры модели я замечаю, что ваша модель ProjectsUser имеет дополнительное поле «projects_users_role_id». Когда ваша модель присоединения сложна (больше, чем просто id, model1_id, model2_id), тогда вам нужно представить ее сама модель. Обычно это называется отношением hasMany Through.

User hasMany ProjectsUser 
Project hasMany ProjectsUser 
ProjectsUserRole hasMany ProjectsUser 

ProjectsUser belongsTo User 
ProjectsUser belongsTo Project 
ProjectsUser belongsTo ProjectsUserRole 

Вы также можете переименовать «ProjectsUser» в нечто более приятное, как «ProjectMembership».

+0

Спасибо! В результате я использовал unbindModel/bindModel для создания объединений и для фильтрации массива результатов. – purple 2010-12-12 19:55:38