Доктрина добавить внешний ключ, но без создания ассоциации - PullRequest
0 голосов
/ 07 февраля 2019

В текущем приложении мы следуем стилю DDD и зависим от DDD, у нас есть совокупная область и мы не можем использовать другие агрегаты в этой области (мы можем использовать только идентификаторы других агрегатов, если нам нужно создать отношения).

Пример: у нас есть совокупность пользователей и совокупность средств массовой информации. У пользователя может быть значок, который относится к средствам массовой информации, но зависит от DDD. Я не могу сделать его похожим на

/**
 * @OneToOne(targetEntity="Media")
 * @JoinColumn(name="icon_id", referencedColumnName="id")
 */
private $icon;

как в таком случае, мне нужно передать целую сущность Media Пользователю, которая нарушает правило DDD.

Таким образом, чтобы следовать правилам DDD, я сделал это просто как

/**
 * @var MediaId
 *
 * @ORM\Column(type="id", nullable=true)
 */
private $iconid;

, но это значит, что мы можемпередать любой идентификатор даже не существовало.Конечно, я могу запросить БД, чтобы проверить, существует ли Media, но опять-таки он нарушает правило DDD, поскольку мы не можем делать никаких действий с Media Aggregate, когда имеем дело с User aggregate.

Так что вопрос в том, могу ли якак-то скажите доктрине добавить внешний ключ без создания ассоциации?Или, может быть, мне нужно добавить внешний ключ вручную через миграции?

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете сделать что-то вроде следующего в вашем установщике:

public function setIcon($icon){
   if( ! ($icon instanceof Media) ){
       /** @var EntityManger $em get your EntityManager **/
       $icon = $em->getReference(Media::class, $icon)
   }

   $this->icon = $icon;
}

это даст вам прокси-элемент, чтобы вы могли установить отношение с этим.

См .: https://www.doctrine -project.org / projects / doctrine-orm / ru / 2.6 / reference / advanced-configuration.html # reference-proxies

и в получателе вы можете просто вернуть идентификатор объекта

...