应用程序基于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 %}
答案 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 %}
不需要'已定义'。