ZF имеет очень хорошую функцию, которую называют findManyToManyRowset, который возвращает Вас непосредственно набор объектов от соединения MN. Целая цель MN состоит в том, чтобы получить информацию от другой таблицы, не от таблицы соединений.
У нас есть эта схема:
- users
- id
- name
- groups
- id
- name
- user_has_groups
- user_id
- group_id
Я хочу создать функцию пользователя, которая возвратит непосредственно набор объектов группы и не набор объектов user_has_groups.
$user->UserHasGroups ;// returns a collection of user_has_groups
$user->Groups; // returns Doctrine_Record_UnknownPropertyException
Существует ли способ сделать это непосредственно?
Doctrine обрабатывает это автоматически, если ваша схема настроена правильно. Я использую Doctrine только как часть Symfony, поэтому мой schema.yml
будет выглядеть примерно так. Вам может потребоваться изменить его, если ваша установка Doctrine использует другой метод для определения вашей схемы:
Users:
columns:
name:
type: string
relations:
Groups:
refClass: UserHasGroups
local: user_id
foreign: group_id
Groups:
columns:
name:
type: string
relations:
Users:
refClass: UserHasGroups
local: group_id
foreign: id
UserHasGroups
columns:
user_id:
type: integer
primary: true
group_id:
type: integer
primary: true
Doctrine будет использовать класс UserHasGroups
как таблицу соединения «многие ко многим». Затем, вызвав $ user-> Groups
, вы получите все связанные объекты Groups
.
В качестве примечания, я бы изменил ваши названия моделей на единственное число, например User
, Group
. $ user = new Users ()
на первый взгляд подразумевает, что вы создаете несколько пользователей за один раз, что, я полагаю, это не так: -)
См. Документацию Doctrine join table docs для получения дополнительных сведений.