Поддерживает ли доктрина составные ключи в таблицах соединения "многие ко многим"?
У меня есть лица 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: channel
Domain\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
Так что такого рода отношения практически такие же, как простые отношения "многие ко многим".
1 ответ
Да это возможно
Вам просто нужно указать, к какой таблице он присоединяется с 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
Официальную документацию для этого можно найти здесь.