我使用Symfony2和原則。我目前有一個名爲Person的實體。該實體與一些其他實體相關爲一對多關係(作爲多對一單向關係)。我希望每個Person實體都是唯一的(我通過使用UniqueConstraint註釋在我的數據庫中完成的)。嵌入式表單持久性:獲取或創建
爲了說清楚,我將假設我有兩個名爲Home和Car的實體,它們都與目標實體Person具有多對一關係。
然後,我使用窗體來創建或編輯我的實體汽車和家庭。在這些表單中,我顯示一個嵌入表單來創建一個Person實體或選擇一個現有的表單。我解釋一下:我的嵌入式表單的第一個字段就是這個人的名字。當用戶鍵入人員姓名時,會顯示現有人員列表(使用JQuery自動完成UI),如果用戶選擇其中一個,則其他字段會自動完成。
問題是,當用戶提交表單與現有的人,我發現了一個完整性錯誤(我知道爲什麼,因爲我的唯一約束)。
第一種解決方法之一是將id字段添加爲嵌入式表單中的隱藏輸入。 但是,用戶可以編輯其他字段並破壞當前實體。 所以沒有。
如果Person已經存在,另一個可能是防止在控制器中持續存在,但正如我在許多其他實體中使用它。我將不得不復制我的代碼,我不想,因爲唯一的約束與Person實體相關,而不是Car或Home實體。 所以再說一次。
我正在處理的解決方法是使用PrePersist偵聽器等待Person實體,但我不知道如何取消persist(也許這是不可能的)。 我有以下代碼:
public function prePersist(LifecycleEventArgs $args) {
$entity = $args->getEntity();
if($entity instanceof Personne) {
$em = $args->getEntityManager();
$persons = $em->getRepository('MyBundle:Person')->findBy(array(
// unique fields
));
if(count($persons) > 0) {
// ... ???
}
}
我已經嘗試了$ EM->分離,但它是無用的,因爲我已經堅持的實體。
我想要的只是一種「獲取或創建」。我解釋,只有兩種情況:
- Person實體(不保留)擁有所有一個現有的數據庫(除外ID字段)相同的字段,所以人的實體是一個數據庫。我必須用數據庫中的「替換」它;
- Person實體(未保留)在數據庫中是唯一的,所以我們創建一個新的(persist)。
或考慮將UniqueEntity約束附加到您的表單。這將帶來額外的好處,能夠通知您的用戶關於爲什麼記錄不能在您付出很少努力的情況下持續下去。 – Cerad
創建自己的getOrCreate並不是什麼大不了的事情。 我能做些什麼來阻止prePersist的堅持步驟? 在我的情況下,數據變形金剛是一個痛苦的脖子,我有很多字段人在我的實體。 @Cerad:我不想提醒用戶!我想在數據庫中不存在的情況下悄悄地創建該人... – gpichot
儘管事實似乎並不合法,但我終於與第二個人一起運行。 – gpichot