Доктрина в Symfony: используйте единую ассоциативную сущность «Автор», относящуюся к разным сущностям

Я разрабатываю собственную систему управления контентом с помощью Symfony 5 и Doctrine.

Я пытаюсь реализовать связь между сущностями Document и Video (на самом деле их намного больше, но для простоты, скажем, всего два) и сущностью User.

Отношение представляет User, который написал документ или записал видео. Соотношение здесь называется Author. У каждого документа или видео может быть один или несколько авторов. У каждого пользователя не может быть ни одного или нескольких документов или видео.

Я бы хотел использовать только один ассоциативный ассоциативный объект Author, вот так:

entity_id|author_id|entity

Где:

  • entity_id: это идентификатор документа или видео.
  • author_id: это user_id, создавший объект.
  • entity: это константа, такая как document или video, чтобы знать, к какому объекту относится отношение.

Проблема в том, что я не могу понять, как это построить в Doctrine. Если бы это были классические отношения SingleEntity<-->Author<-->Users, я бы построил их как элемент ManyToMany, но здесь все по-другому.

Author, вероятно, будет содержать два отношения ManyToOne (одно с сущностью User и одно с сущностью Document или Video) плюс поле entity type, но я действительно не знаю, как закодировать часть «DocumentorVideo». Я имею в виду:

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity=??????????, inversedBy = "authors")
     * @ORM\JoinColumn(nullable=false)
     */
    private $entity; // Document or Video

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy = "articles")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\Column(type = "smallint")
     */
    private $entityType;

Как мне управлять первым полем?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предлагаю сохранить пространство имен сущностей Ex. Acme\Entity\Document в свойстве и id в другом, а также использовать диспетчер сущностей для получения сущности.

Обновлено: хотя у вас не будет отношения, я предпочитаю этот способ другим, потому что он многоразовый, а производительность примерно такая же. Кроме того, если мне нужно передать его в ответ JSON, я просто создаю нормализатор, и все готово.

/**
 * @ORM\Column(type = "string")
 */
private $entityNamespace;

/**
 * @ORM\Column(type = "integer")
 */
private $entityId;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}

public function getEntity()
{
    return $this->em->getRepository($this->entityNamespace)->find($this->entityId);
}

Я учту это, спасибо.

Dr. Gianluigi Zane Zanettini 01.04.2021 13:37
Ответ принят как подходящий

Не знаю, лучше ли хранить его под двумя разными атрибутами. Если нет и обязательно, я думаю, что эти «объекты» должны иметь общий интерфейс или что-то в этом роде, поэтому обратите внимание на наследование доктрины, который должен удовлетворить ваши потребности.

Наследование одной таблицы - это то, что я искал, спасибо!
Dr. Gianluigi Zane Zanettini 01.04.2021 16:33

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