2013-11-03 3 views
3

У меня есть модель User и модель Role в приложении CakePHP. Связь между этими двумя моделями заключается в следующем:cakephp найти условия запроса для соответствующей модели

User $belongsTo Role 
Role $hasMany User 

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

$supervisors = $this->User->find('all', array(
    'contain' => array(
     'Role' => array(
      'conditions' => array(
       'Role.name' => 'Supervisor' 
      ) 
     ) 
    ) 
)); 

Но приведенный выше запрос возвращает мне всех пользователей в таблице моих пользователей. Он не возвращает только пользователей с ролью Supervisor. Я знаю, что если я делаю два запроса, один из модели Role, чтобы найти идентификатор типа роли «Супервизор», а затем выполнить другой запрос в модели пользователя и передать идентификатор записи роли супервизора в условиях моей модели пользователя например:

$supervisor_role_id = $this->Role->field('id', array('Role.name' => 'Supervisor')); 

$supervisors = $this->User->find('all', array(
    'conditions' => array(
     'User.role_id' => $supervisor_role_id 
    ) 
)); 

Вышеуказанные вопросы дадут мне желаемый результат. Но я не хочу делать 2 запроса для этого. Почему не работает первый подход. Любая идея, пожалуйста?

Спасибо

ответ

6

Причина ваша попытка не работает

CakePHP в Containble поведение создает отдельные запросы для каждой модели. Итак, что вы делали, в основном описывалось так: «Найти всех пользователей. Также найдите любые роли с именем« Супервизор ». Как вы можете видеть, нет никакого условия, которое пересекает между ними.

Таким образом, вы можете выполнить одно из следующих действий:

1) [простой способ] Запрос другой путь вокруг

запросов от Role модели и содержать его пользователя (ей). Это вытащит ту роль, которую вы хотите (на основе ваших условий), а затем содержит всех/всех ее пользователей.

Примечание. Если вы уже загрузили модель «Пользователь» (или она была загружена по умолчанию, потому что вы находитесь в UsersController), вы можете запустить свою находку следующим образом: $this->User->Role->find(..... - так что вам не нужно загрузите модель Role отдельно.

2) Использование соединений (см CakePHP Book on Joining Tables)

Это позволяет ограничить результат родительской модели, основанной на это связано данные.

+0

«User $ roleTo Role» Таким образом, в этом случае было бы правильно запросить пользователя и оставить его в роли. Он не должен создавать отдельный запрос здесь, если он настроен правильно. – mark

+0

@mark - Я упомянул, что он может использовать Joins (# 2). Или он мог бы просто отменить запрос и использовать Containable. Множество вариантов. – Dave

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