2013-11-12 6 views
1

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

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

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

И ...

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

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

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

+0

Я думаю, что «торт» будет использовать Containables - http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html. Моя рекомендация заключалась бы в том, чтобы вручную использовать объединения в вашем 'find()' - http://book.cakephp.org/2.0/ru/models/associations-linking-models-together.html#joining-tables. Причина в следующем: скажем, вы ищете всех пользователей в группе X. Если вы используете Containable, он вернет ВСЕ пользователей, и если они не находятся в группе X, их массив групп() будет пуст. Если они находятся в группе X, они будут заполнены данными группы X. Обычно не то, что вы хотите. – iso27002

+0

@ iso27002 - спасибо за это, это очень полезно. Но я думаю, что у меня разрыв в понимании. Как я должен использовать «connect table» classes_users для выполнения поиска? Пример ссылки, которую вы отправили, показывает мне, как получить всю информацию о группах. Но как найти все группы, связанные с текущим идентификатором Auth-> User-> id? – itamar

+0

Если вы используете формат, который вы разместили выше для декларации '$ hasAndBelongsToMany', вам необходимо убедиться, что вы соблюдаете правильные соглашения об именах торта, поэтому у Cake нет проблем с автоматическим поиском данных. См. Ответ @ Kai для получения дополнительной информации. – iso27002

ответ

2

CakePHP по умолчанию имеет рекурсивный набор в 1, что означает, что при условии, что вы не изменили рекурсивную настройку, он будет автоматически извлекать все связанные курсы, когда вы вызываете find у пользователя, при условии, что вы настроили связь 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 автоматически выполнит оставшуюся часть работы.

+0

Спасибо @Kai - это здорово! Но есть ли ошибка в поиске, которую вы там положили? Там нет упоминаний о курсах. – itamar

+1

Нет, как я уже сказал, до тех пор, пока отношения установлены и рекурсивный установлен на 1 или выше, он должен автоматически получать курсы с пользователями. Если рекурсивное значение установлено ниже 1, вы можете использовать include: '$ this-> User-> find ('first', array ('conditions' => array ('User.id => $ this-> Auth-> user ('id')), 'содержать' => 'Course')); ' – Kai

+0

Я понял это после того, как спросил - спасибо, Кай, это было прекрасно! – itamar

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