没有仔细检查我为什么要这样做(这可能听起来像是一种糟糕的方法,但我有充分的理由)我想知道标准框架版本3.1+中是否有一种方法可以创建与实体的关系关联那可能不存在......
首先,我确实意识到这决定了架构,这很好。因此,如果实体不存在,则它不会创建外键,并且该字段始终为null,或者如果目标实体确实存在,则会创建外键,并且该字段的工作方式类似于普通关联......
其次,这只会将项目更改为项目,并且可能会更改该行作为更新,我意识到可能需要进行手动架构更新。
最好没有第三方捆绑依赖...希望标准框架能够做到这一点,
任何人? 提前致谢
修改
我在我的实体中使用带有学说ORM的注释
此外
我这样做的最简单版本是因为某些bundle是可选的项目到项目,而bundle A只有在它存在时才可以使用bundle B中的实体。我考虑过使用服务,如果container->然后是container-> get,或者是XML on-invalid =“null”方法,但这并没有解决属性持久性问题。我很高兴将非映射值存储为自定义关系字段,这很好,只是更长,并想知道是否有一种方式Doctrine可以忽略缺少的targetEntity ......
答案 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
或实施自己的解决方案的可扩展行为。