Symfony Association Mapping OneToOne и OneToMany для одной и той же организации

У меня есть объект представления, который представляет основную запись страницы, а затем у меня есть связанный объект, называемый ViewVersion который хранит несколько версий объекта, поскольку он изменяется с течением времени. Объект View устанавливает текущую «опубликованную» ViewVersion в поле VersionId . Это создает простую ассоциацию OneToOne. Но в некоторых контекстах я также хочу получить все версии, связанные с этим представлением View , например, если я хочу разрешить пользователю просматривать старые версии и возвращаться обратно. Поэтому мне понадобится другое отображение, которое является OneToMany. Первая viewVersion будет отображаться в активной «опубликованной» версии, а вторая viewVersions отобразит все версии.

Определения сущностей

 /** * @ORM\Entity * @ORM\Table(name="view") * @ORM\Entity(repositoryClass="Gutensite\CmsBundle\Entity\View\ViewRepository") */ class View extends Entity\Base { /** * @ORM\OneToOne(targetEntity="\Gutensite\CmsBundle\Entity\View\ViewVersion", inversedBy="view", cascade={"persist", "remove"}, orphanRemoval=true) * @ORM\JoinColumn(name="versionId", referencedColumnName="id") */ protected $viewVersion; /** * @ORM\Column(type="integer", nullable=true) */ protected $versionId = NULL; /** * @ORM\OneToMany(targetEntity="\Gutensite\CmsBundle\Entity\View\ViewVersion", mappedBy="viewAll", cascade={"persist", "remove"}, orphanRemoval=true) */ protected $viewVersions; } /** * @ORM\Entity * @ORM\Table(name="view_version") * @ORM\Entity(repositoryClass="Gutensite\CmsBundle\Entity\View\ViewVersionRepository") */ class ViewVersion extends Entity\Base { /** * @ORM\OneToOne(targetEntity="\Gutensite\CmsBundle\Entity\View\View", mappedBy="viewVersion", cascade={"persist"}) */ protected $view; /** * @ORM\ManyToOne(targetEntity="\Gutensite\CmsBundle\Entity\View\View", inversedBy="viewVersions") * @ORM\JoinColumn(name="viewId", referencedColumnName="id") */ protected $viewAll; /** * The primary view entity that this version belongs to. * @ORM\Column(type="integer", nullable=true) */ protected $viewId; } 

Это «работает», но рекомендуется ли иметь две ассоциации с одним и тем же объектом? Или это действительно плохая идея?

Объект ViewVersion будет ссылаться на один объект View в обоих случаях, но сопоставленные ассоциации нуждаются в двух отдельных переменных, например View и ViewAll . Я не совсем уверен, как работают внутренние компоненты для ассоциации, и как используется эталонная переменная с отображением.

В качестве альтернативы, я мог бы избавиться от ассоциации OneToOne и просто установить функцию ViewRepository, чтобы получить текущую опубликованную версию на основе versionId (точно так же, как старый сопоставленный объект имел обыкновение делать с getVersion ()). Это сработает, но будет ли оно более внутренним, потому что это сделает два запроса … или Doctrine будет достаточно умным, чтобы оптимизировать это, точно так же, как с getVersion ().

ПРИМЕЧАНИЕ. Эти другие ответы не являются полными.

Ссылки: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html http://doctrine-orm.readthedocs.org/en/2.0.x /reference/association-mapping.html#one-to-many-bidirectional