2012-02-08 115 views
4

我已經看過幾篇文章,但找不到工作解決方案。Symfony 2 +學說:如何抑制SQLSTATE [23000]:完整性約束違規:1062重複條目

我的問題是超越簡單:

我有說idurltitle的實體。該URL應該是唯一的(在MySQL PDO中)。我設法創建了實體和模式,沒有任何問題。現在,當我走過一些記錄時,我分別撥打persist(),最後撥打flush()。問題是,當我嘗試插入URL的重複條目時,它給了我一個例外。如何抑制它?

當插入一個重複項時,它應該跳過它並插入其餘項。無需事件,ON UPDATE語句,觸發器和所有那些花哨的東西。

我試過抓住persistflush()拋出的任何異常,但看起來似乎無法正確執行。

歡迎任何想法,謝謝!

編輯:發現我的解決方案在這裏:Symfony2 Controller won't catch exception

回答

2
try { 
    $em->flush() 
} catch (\PDOException $e) { 
    // ... Error on database call 
} 

一個更好的方法是指定一個驗證contstraint以避免處理這個例外。在YAML(從symfony docs截取)

Acme\SomeBundle\Entity\Item: 
    constraints: 
     - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: url 
+0

我真的不知道如何以及在哪裏寫(我是新來的Symfony),但是從文檔,我得到了註解'聲明@ ORM \ Column(..,unique = true)',它仍然會給出SQL錯誤。有趣的部分是錯誤來自MySQL,而不是Doctrine。原則無法知道數據庫中是否存在價值,而不對數據庫進行單獨檢查,而(就績效而言)這是不可接受的。 – 2012-02-09 02:56:02

+0

錯誤來自MySQL,因爲唯一標註指定了該列上的唯一索引。在嘗試將數據插入數據庫之前,您應該驗證您的數據是否正確。捕捉(多個)異常是一個代價高昂的操作。它更有意義,並且是插入前驗證數據的良好實踐。 – 2012-02-09 10:38:15

+0

我明白了,但是我如何驗證實體中的字段在數據庫中是唯一的,而無需進行昂貴的數據庫檢查? – 2012-02-09 16:39:13

12

在Symfony的2.1+,使用\Doctrine\DBAL\DBALException代替\PDOException抓住它。

try { 
    ... 
} catch (\Doctrine\DBAL\DBALException $e) { 
    // ... Error on database call 
} 
+5

不要忘記在學說之前放一回斜線,否則你什麼也收不到! – 2013-04-26 14:57:58

6

請注意,如果您正在使用Symfony 2.1中引發的PDOException,刪除父項關係的條目。但爲了抓住它,你將使用由伊赫桑

建議
try { 
     $em = $this->getDoctrine()->getEntityManager(); 
     $em->remove($entity); 
     $em->flush(); 
    } catch(\Doctrine\DBAL\DBALException $e) 
    { 
     // ... 
    } 
相關問題