У меня есть лица Channel
а также Post
, Channel
имеет простое целое число id
, Post
имеет составной ключ из собственного id
а также channel_id
,
Я хотел бы иметь отношения многих ко многим между этими объектами (упомянуть), чтобы один Post
может быть, многие упоминали Channel
с и Channel
могут быть упомянуты многими Posts
,
Вопрос в том, поддерживает ли это Доктрина, как мне реализовать такие отношения?
Domain\Telegram\Models\Channel:
type: entity
id:
id:
type: integer
fields:
name:
type: string
nullable: true
oneToMany:
posts:
targetEntity: Domain\Telegram\Models\Post
mappedBy: channelDomain\Telegram\Models\Post:
type: entity
id:
channel:
associationKey: true
id:
type: integer
manyToOne:
channel:
targetEntity: Domain\Telegram\Models\Channel
inversedBy: posts
Обновление и решение
Решение от @WilliamPerron почти сработало. Если используется в его текущем состоянии, doctrine:schema:validate
возвращает ошибку:
[Mapping] FAIL — недопустимое отображение класса сущностей ‘Domain \ Telegram \ Models \ Channel’:Столбцы обратного соединения в «упоминаниях» таблицы «многие ко многим» должны содержать ВСЕ столбцы идентификаторов целевого объекта.
‘Domain \ Telegram \ Models \ Post’, однако ‘channel_id’ отсутствует.
Раздел inverseJoinColumns должен выглядеть следующим образом:
inverseJoinColumns:
post_id:
referencedColumnName: id
post_channel_id:
referencedColumnName: channel_id
Так что такого рода отношения практически такие же, как простые отношения «многие ко многим».
Вам просто нужно указать, к какой таблице он присоединяется с groups
элемент, а затем объект, на который он отображается. Для однонаправленных отношений схема будет выглядеть следующим образом:
Channel:
type: entity
manyToMany:
posts:
targetEntity: Post
joinTable:
name: posts_channels
joinColumns:
channel_id:
referencedColumnName: id
inverseJoinColumns:
post:
referencedColumnName: id
и для двунаправленных отношений, вам нужно будет добавить inversedBy
элемент:
Channel:
type: entity
manyToMany:
posts:
targetEntity: Post
inversedBy: channels
joinTable:
name: posts_channels
joinColumns:
channel_id:
referencedColumnName: id
inverseJoinColumns:
post_id:
referencedColumnName: id
Post:
type: entity
manyToMany:
channels:
targetEntity: Channel
mappedBy: posts
Официальную документацию для этого можно найти Вот.
Других решений пока нет …