Получение всех групп, принадлежащих пользователю

У меня есть HABTM для пользователей и групп. Я хочу показать в представлении группы - все группы, принадлежащие пользователю. Или, другими словами, все Группы, в которых есть Пользователь.

Я запутался в MVC и не могу понять это. Вот две мои модели: класс Course расширяет AppModel

  public $name = 'Course';
  public $hasAndBelongsToMany = array('User' =>
            array(
                'unique' => false
            )
            );

И...

 public $name = 'User';
  public $hasAndBelongsToMany = array('Course' =>
            array(
                'unique' => true
            )
            );

Имя таблицы в базе данных — courses_users — в этой таблице хранятся идентификаторы групп и идентификаторы пользователей.

Должно быть достаточно просто, но я новичок в CakePHP, поэтому мне нужна помощь. Спасибо!


person itamar    schedule 12.11.2013    source источник
comment
Я предполагаю, что способ Cake будет заключаться в использовании Containables - book.cakephp .org/2.0/en/core-libraries/behaviors/. Я бы рекомендовал вместо этого вручную использовать объединения в ваших find() - book.cakephp.org/2.0/en/models/ . Причина в следующем: скажем, вы ищете всех пользователей в группе X. Если вы используете Containable, он вернет ВСЕХ пользователей, и если они не в группе X, их массив Group () будет пустым. Если они находятся в группе X, она будет заполнена данными группы X. Обычно не то, что вы хотите.   -  person iso27002    schedule 12.11.2013
comment
@iso27002 iso27002 - спасибо за это, это очень полезно. Но я думаю, что у меня есть разрыв в понимании. Как я должен использовать соединительную таблицу курсов_пользователей для выполнения поиска? Пример в ссылке, которую вы прислали, показывает мне, как получить всю информацию о группах. Но как насчет поиска всех групп, связанных с текущим идентификатором Auth-›User-›id?   -  person itamar    schedule 12.11.2013
comment
Если вы используете формат, который вы разместили выше для своей декларации $hasAndBelongsToMany, вам необходимо убедиться, что вы следуете правильным соглашениям об именах Cake, чтобы у Cake не было проблем с автоматическим поиском данных. См. Ответ @Kai для получения дополнительной информации.   -  person iso27002    schedule 12.11.2013
comment
Спасибо, @iso27002 - ответ Кая был правильным.   -  person itamar    schedule 12.11.2013


Ответы (1)


CakePHP по умолчанию имеет рекурсивное значение 1, что означает, что если вы не изменили параметр рекурсии, он автоматически извлечет все связанные курсы, когда вы вызовете поиск для пользователя, предполагая, что вы установили отношение HABTM при выполнении поиска. Поэтому все, что вам нужно сделать, это:

$this->User->find('first', array('conditions' => array('User.id' => $this->Auth->user('id'))));

В вашей модели пользователя я не думаю, что это строго необходимо, но мне нравится указывать таблицу соединений и т. д. в отношениях HABTM:

public $hasAndBelongsToMany = array('Course' =>
        array(
            'unique' => true,
            'dependent' => false,
            'joinTable' => 'courses_users',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'course_id',
        )
    );

Имейте в виду, что в отношениях HABTM вы никогда не касаетесь joinTable, кроме указания, какую таблицу использовать в качестве joinTable при настройке отношения. CakePHP автоматически сделает остальную работу.

person Kai    schedule 12.11.2013
comment
Спасибо @Kai - это здорово! Но есть ли ошибка в находке, которую вы туда поместили? О курсах речи не идет. - person itamar; 12.11.2013
comment
Нет, как я уже сказал, пока отношения настроены и рекурсивность установлена ​​на 1 или выше, она должна автоматически получать курсы с пользователями. Если для рекурсии установлено значение меньше 1, вы можете, однако, использовать contains: $this->User->find('first', array('conditions' => array('User.id => $this->Auth->user('id')), 'contain' => 'Course')); - person Kai; 12.11.2013
comment
Я понял это после того, как спросил - большое спасибо, Кай - это было прекрасно! - person itamar; 12.11.2013
comment
в качестве дополнительного вопроса, вы знаете, как я могу найти Омегу этого? В смысле, все курсы, где пользователь не зарегистрирован? - person itamar; 13.11.2013
comment
Что вам придется сделать свой собственный оператор соединения, я думаю, что-то вроде $this->Course->find('all', array('joins' => array('table' => 'courses_users', 'alias' => 'CoursesUser', 'type' => 'left', 'conditions' => array('Course.id = CoursesUser.course_id', 'CoursesUser.user_id' => $this->Auth->user('id')))); Я не слишком уверен, что правильно написал эту логику соединения. - person Kai; 13.11.2013