Я разрабатываю собственную систему управления контентом с помощью 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;
Как мне управлять первым полем?






Я предлагаю сохранить пространство имен сущностей 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);
}
Не знаю, лучше ли хранить его под двумя разными атрибутами. Если нет и обязательно, я думаю, что эти «объекты» должны иметь общий интерфейс или что-то в этом роде, поэтому обратите внимание на наследование доктрины, который должен удовлетворить ваши потребности.
Я учту это, спасибо.