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 %}
不需要 '被定义'。
答
如果您使用的是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 %}
你仍然需要默认过滤器,因为如果一个实体没有形式关联,则会抛出一个找不到异常的方法。
我也试过了。我认为问题在于,即使关联的记录被删除,实际上引用的标识仍然可用于该记录,但是如何检查它? – trikess 2014-09-03 12:04:53
如果你想检查参考ID是否存在,那么如果它将进入里面,如果条件参考ID在那里。尝试打印{{programme.form.feldName}}。如果你想在删除父行删除时设置null,只需在你的实体关系中使用OnDelete =“SET NULL”。如果您不再需要删除父行上的子行,则将onDelete =“CASCADE”。那么你不再需要像这样检查模板文件。:) – herr 2014-09-04 09:11:03