2017-03-02 137 views
2

没有仔细检查我为什么要这样做(这可能听起来像一个坏的方法,但我有很好的理由)我想知道是否有一种方法在标准框架版3.1+创建一个关系联系到一个实体,可能不存在...Symfony&Doctrine:可选外键

首先我明白这确定了架构,这很好。因此,如果一个实体不存在,它不会创建一个外键,并且该字段始终为空,或者如果目标实体确实存在,它将创建外键,并且该字段的工作方式与正常关联类似...

其次,这只会将项目更改为项目,并且可能会更改为更新,我认识到需要手动更新模式。

最好不用第三方软件包的依赖......希望能为标准框架,要做到这一点,

任何人? 在此先感谢

编辑

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

此外

为什么我这样做最简单的版本是因为某些软件包是可选的项目到项目,并且捆绑包A可以仅在捆绑B存在时才使用捆绑B中的实体。我已经考虑过使用服务,如果容器 - >然后容器 - >获取,或XML on-invalid =“null”的方法,但这并没有解决属性持久性问题。我很高兴存储一个非映射值作为自定义关系字段,这很好,只是更长,并想知道是否有一种方法学说可以忽略缺少目标实体...

回答

1

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

这是一个'可为空的关联目标'meta data这是一个不同的事情的答案。

OP要求提供targetEntity在他的情况下不存在的元数据,例如,是不是在一个不同的捆绑(或任何OP的神秘原因可能是)。

在这种情况下,我建议建立在原则的TargetEntityListener它能够在运行时解决targetEntity和targetEntity可以设置为一个抽象类或接口:

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

InvoiceSubjectInterface随后将在运行时被替换通过配置如提供的特定类:

# app/config/config.yml 
doctrine: 
    # ... 
    orm: 
     # ... 
     resolve_target_entities: 
      Acme\InvoiceBundle\Model\InvoiceSubjectInterface: AppBundle\Entity\Customer 

所以这应该是eiter一个可扩展的行为提供no class或实现一个自己SOLU灰。

+0

这是一个伟大的建议谢谢,将探索并看看它是否适合我的需求......你是一位传奇先生 – Prof83

3

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

通过注释创建ASSOCATION:

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

,并使用

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

作为二传手,让空的值。

和你的getter可能看起来像:

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

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

+0

不,不是想象中的那么简单,在targetEntity实体=可能会或可能不存在,如果没有,一个例外是可以理解的提高,所以我想教义忽略的能力......? – Prof83

+0

所以你必须重新解释你的问题,并且解释你为什么要这么做。对我来说,这根本没有意义。为什么不创建实体,如果你不想使用它,简单的不要使用它。 – LBA

+0

我的问题解释说,这个实体可能不存在,它也说,有没有必要审视我为什么这样做,问题是,能不能做到......对不起,说白了,不过这一切都没有 – Prof83