doctrine添加外键但不创建关联

问题描述 投票:0回答:1

在当前的应用程序中,我们遵循DDD样式并依赖于DDD,我们有聚合范围,不能在该范围内使用其他聚合(如果我们需要建立关系,我们只能使用其他聚合的id)。

示例:我们有用户聚合,我们有媒体聚合,用户可以有一个图标,这是与媒体的关系,但依赖于DDD我不能使它像

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

在这种情况下,我需要将整个Media实体传递给破坏DDD规则的User。

所以为了遵循DDD规则,我就这样做了

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

但这意味着我们可以传递任何甚至不存在的id。我肯定可以查询数据库以检查媒体是否存在,但是它再次打破DDD规则,因为当我们与User聚合达成交易时,我们无法对Media聚合进行任何操作。

所以问题是我可以以某种方式告诉学说添加外键而不创建关联吗?或者我可能需要通过迁移手动添加外键?

doctrine domain-driven-design
1个回答
0
投票

您可以在setter中执行以下操作:

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/en/2.6/reference/advanced-configuration.html#reference-proxies

在getter中你可以返回对象的id

© www.soinside.com 2019 - 2024. All rights reserved.