Symfony& Doctrine:可选的外键

时间:2017-03-02 08:20:07

标签: doctrine-orm symfony

没有仔细检查我为什么要这样做(这可能听起来像是一种糟糕的方法,但我有充分的理由)我想知道标准框架版本3.1+中是否有一种方法可以创建与实体的关系关联那可能不存在......

首先,我确实意识到这决定了架构,这很好。因此,如果实体不存在,则它不会创建外键,并且该字段始终为null,或者如果目标实体确实存在,则会创建外键,并且该字段的工作方式类似于普通关联......

其次,这只会将项目更改为项目,并且可能会更改该行作为更新,我意识到可能需要进行手动架构更新。

最好没有第三方捆绑依赖...希望标准框架能够做到这一点,

任何人? 提前致谢

修改

我在我的实体中使用带有学说ORM的注释

此外

我这样做的最简单版本是因为某些bundle是可选的项目到项目,而bundle A只有在它存在时才可以使用bundle B中的实体。我考虑过使用服务,如果container->然后是container-> get,或者是XML on-invalid =“null”方法,但这并没有解决属性持久性问题。我很高兴将非映射值存储为自定义关系字段,这很好,只是更长,并想知道是否有一种方式Doctrine可以忽略缺少的targetEntity ......

2 个答案:

答案 0 :(得分:3)

嗯,也许我误解了你的问题,但这听起来像是一个正常的,可空的'与我联系?

通过注释创建关联:

/**
 *
 * @var Child
 * @ORM\ManyToOne(targetEntity="Child")
 */
private $child;

并使用

setChild(Child $child = null)
{
  $this->child = $child;
}

作为允许可以为空的值的Setter。

你的吸气器可能看起来像:

getChild()
{
  return $this->child;
}

如果没有任何child,它将返回null。

答案 1 :(得分:1)

我会保留另一个答案,因为它回答了'可空的关联目标'live data的问题。

这是'可空关联目标'meta data的答案,这是另一回事。

OP要求在元数据中提供targetEntity,在他的情况下不存在,例如是不是在另一个捆绑(或任何OP的神秘理由)。

在这种情况下,我建议在Doctrine的TargetEntityListener上构建,它能够在运行时解析targetEntity,targetEntity可以设置为抽象类或接口:

 /**
 * @ORM\ManyToOne(targetEntity="Acme\InvoiceBundle\Model\InvoiceSubjectInterface")
 * @var InvoiceSubjectInterface
 */
protected $subject;

InvoiceSubjectInterface将在运行时由config例如:

提供的特定类替换
# app/config/config.yml
doctrine:
    # ...
    orm:
        # ...
        resolve_target_entities:
            Acme\InvoiceBundle\Model\InvoiceSubjectInterface: AppBundle\Entity\Customer

因此,这应该是提供no class或实施自己的解决方案的可扩展行为。