Doctrine2 - 检查相关条目是否已删除(单向关系)

时间:2014-09-03 09:56:14

标签: symfony doctrine-orm twig

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

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

实体示例:

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

Twig check:

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

2 个答案:

答案 0 :(得分:2)

如果您使用InnoDB引擎进行Mysql,您可以添加

onDelete="SET NULL"

对于您的关系,因此当删除引用的实体时,该字段将设置为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 %}

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

答案 1 :(得分:0)

检查如下:

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

不需要'已定义'。