CakePHP: Как я могу запросить результаты на основе условий ассоциации 2-го уровня? - PullRequest
2 голосов
/ 29 ноября 2011

Предположим, у нас есть 3 модели, Пользователь, Дом и Профиль со следующими ассоциациями между ними:

  • У пользователя есть Дом (Дом принадлежит Пользователю)
  • Пользователь имеет профиль (профиль принадлежит пользователю)

Я хотел бы запросить дома (внутри класса HousesController), чьи связанные профили удовлетворяют заданным условиям профиля. Рассмотрим следующий пример:

Предполагая, что пол является свойством модели профиля, я хотел бы получить все дома, владельцем которых является мужчина.

Я нашел этот вопрос, который достаточно близок к тому, что я ищу. В моем случае, отношения между моделями более сложны (дом принадлежит пользователю hasOne Profile), и я не могу заставить его работать. Я пытался что-то вроде этого, без всякой удачи:

$this->House->find('all', array(
                  'contain' => array(
                      'User' => array(
                          'Profile' => array(
                              'conditions' => array(
                                  'Profile.gender' => 'male'
))))));

Приведенный выше вызов возвращает все дома, и в случае, если пол мужской, он включает в себя соответствующий профиль пользователя. В противном случае профиль пользователя остается пустым. Что именно мне нужно, так это вернуть только домов, владельцем которых является мужчина.

Я на самом деле реализовал это с помощью опции 'joins' функции Model::find(), но я хотел бы знать, возможно ли это без с использованием 'joins' и если да, то как?

1 Ответ

2 голосов
/ 29 ноября 2011

Я бы порекомендовал явно объявить отношения, используя метод bindModel .

Это можно сделать с помощью контроллера Houses следующим образом:

/**
 * Bind the models together using explicit conditions
 */
$this->House->bindModel(array(
  'belongsTo' => array(
    'User' => array(
      'foreignKey' => false,
      'conditions' => array('House.user_id = User.id')
    ),
    'Profile' => array(
      'foreignKey' => false,
      'conditions' => array('Profile.user_id = User.id')
    )
  )
));

/**
 * Standard find, specifying 'Profile.gender' => 'male'
 */
$houses = $this->House->find('all', array(
  'conditions' => array(
    'Profile.gender' => 'male'
  )
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...