2014-09-03 59 views
0

應用程序是基於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 %} 

回答

0

檢查,如:

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

2

如果您使用的是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