MN отношения в доктрине - PullRequest
1 голос
/ 25 июня 2010

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 

Есть ли способ сделать это напрямую?

1 Ответ

2 голосов
/ 25 июня 2010

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 .

...