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

问题描述:

应用程序是基于Symfony2和Doctrine2构建的。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 %} 

检查,如:

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

不需要 '被定义'。

+0

我也试过了。我认为问题在于,即使关联的记录被删除,实际上引用的标识仍然可用于该记录,但是如何检查它? – trikess 2014-09-03 12:04:53

+0

如果你想检查参考ID是否存在,那么如果它将进入里面,如果条件参考ID在那里。尝试打印{{programme.form.feldName}}。如果你想在删除父行删除时设置null,只需在你的实体关系中使用OnDelete =“SET NULL”。如果您不再需要删除父行上的子行,则将onDelete =“CASCADE”。那么你不再需要像这样检查模板文件。:) – herr 2014-09-04 09:11:03

如果您使用的是InnoDB引擎对于MySQL,你可以添加

onDelete="SET NULL" 

你们的关系,所以当被引用的实体被删除字段将被设置为null。

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

这样你根本就没有链接到缺失的实体,它不再是枝条问题。

如果使用软删除:

然后是IM假设你是萎靡不振该实体在某种程度上为删除,你可以这样做:

{% 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 %} 

你仍然需要默认过滤器,因为如果一个实体没有形式关联,则会抛出一个找不到异常的方法。

+0

嗨, 这看起来非常好,但它可能不适合我,因为我没有完全删除这些条目,但只使用软删除对不起,我没有提到这一点。 – trikess 2014-09-05 08:45:54

+0

然后您可以检查您正在使用的列以指示“软删除”。使用默认的树枝过滤器可以阻止你找到没有表单的实体的方法没有发现的异常。 – Chausser 2014-09-08 18:22:06