首页 文章

Symfony&Doctrine:可选的外键

提问于
浏览
2

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

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

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

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

任何人?提前致谢

Edit

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

Furthermore

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

2 回答

  • 1

    我会保留另一个答案,因为它回答了'nullable association target' live data 的问题 .

    这是'nullable association target' meta data 的答案,这是另一回事 .

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

    在这种情况下,我建议在Doctrine的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
    

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

  • 3

    嗯,也许我误解了你的问题,但这听起来像是一个正常的“可空”的关联给我?

    通过注释创建关联:

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

    并使用

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

    作为一个允许可以为空的值的Setter .

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

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

    如果没有 child ,它将返回null .

相关问题