【问题标题】:Doctrine2 - check if associated entry was deleted (unidirectional relationship)Doctrine2 - 检查关联条目是否被删除(单向关系)
【发布时间】:2014-10-27 18:43:25
【问题描述】:

应用程序基于 Symfony2 和 Doctrine2 构建。

我有单向关系 OneToMany,当关联的实体条目被删除时,引用列仍设置为指向已删除的条目,这是正确的行为,因为它只是单向关联。但这导致我在树枝模板中出现问题,因为如果我要尝试加载它,它将抛出一个错误实体未找到。我试图使用定义检查树枝,但没有区别。检查相关条目是否未被删除的最佳方法是什么?

实体示例:

class Programme
{
    ...
    /**
     * @var string
     *
     * @ORM\ManyToOne(targetEntity="Form")
     * @ORM\JoinColumn(name="form_id", referencedColumnName="id", nullable=true)
 */
     private $form;
    ...
}  

树枝检查:

{% if programme.form is defined %}
    //always getting here
{% endif %}  

【问题讨论】:

    标签: symfony doctrine-orm twig


    【解决方案1】:

    如果你使用 InnoDB 引擎 for Mysql 你可以添加

    onDelete="SET NULL"
    

    到您的关系,因此当引用的实体被删除时,该字段将设置为空。

    @ORM\JoinColumn(name="form_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
    

    这样你根本就没有丢失实体的链接,这不再是树枝问题。

    如果使用软删除:

    然后我假设您以某种方式将该实体标记为已删除,您可以执行以下操作:

    {% if programme.form.deleted|default(true) != true %}
        //Your form will always be defined but if 
        //its deleted then you want to ignore it
    {% endif %}
    

    这假设您在表单上有一个deleted 列。它还对没有表单的条目使用默认值 true。

    如果您想简化此检查,您可以在表单实体上实现类似 isNotDeleted() 的方法:

    public function isNotDelete()
    {
        return $this->deleted === false;
    }
    

    那么你的树枝检查就是:

    {% if programme.form.notDeleted|default(false) %}
        //do stuff
    {% endif %}
    

    您仍然需要默认过滤器,因为如果实体没有表单关联,则会引发方法未找到异常。

    【讨论】:

    • 嗨,这看起来很不错,但它可能不适合我,因为我没有完全删除这些条目,而是使用软删除 抱歉,我之前没有提到。
    • 然后您可以检查您使用的任何列来指示“软删除”。使用默认的 twig 过滤器将阻止您为没有表单的实体获取方法未找到异常。
    【解决方案2】:

    检查喜欢:

    {% if programme.form %}
        //always getting here
    {% endif %}  
    

    不需要“已定义”。

    【讨论】:

    • 我也试过了。我认为问题在于即使删除了关联的记录,实际上引用的 id 仍然可用于该记录,但是如何检查呢?
    • 如果你想检查参考 id 是否存在,那么如果条件参考 id 存在,它将进入内部。尝试打印 {{ program.form.feldName }}。如果要在删除父行删除时设置 null,只需在实体关系中使用 OnDelete="SET NULL"。如果在删除父行时不再需要该子行,请放置 onDelete="CASCADE"。然后您不再需要像这样签入模板文件。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2017-01-27
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多