Поддерживает ли доктрина составные ключи в таблицах соединения "многие ко многим"?

У меня есть лица 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

Официальную документацию для этого можно найти здесь.

Другие вопросы по тегам