2012-02-08 13 views
4

私はいくつかの記事を調べましたが、実際の解決策を見つけることができませんでした。Symfony 2 + Doctrine:SQLSTATE [23000]を鎮圧する方法:整合性制約違反:1062重複したエントリ

私の質問はシンプルを超えて:

私は実体を持ってidurltitle言います。 URLは一意である必要があります(MySQL PDOの場合)。エンティティとスキーマの両方を問題なく作成することができました。今私はいくつかのレコードを歩いて、私はそれぞれpersist()と呼び、最終的にはflush()です。問題は、URLの重複エントリを挿入しようとすると、例外が発生するということです。それを抑圧するには?

重複したエントリが挿入されている場合、それをスキップして残りの部分を挿入するだけです。イベント、ON UPDATEステートメント、トリガー、そしてすばらしいものは必要ありません。

私はpersistまたはflush()でスローされた例外をキャッチしようとしましたが、実際には正しく動作していないようです。

アイデアは大歓迎です、ありがとうございます!

編集:ここに私の解決策が見つかりました:Symfony2 Controller won't catch exception

答えて

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

より良いアプローチは、この例外に対処することを避けるために、検証contstraintを指定することです。 YAMLに\Doctrine\DBAL\DBALException代わりに\PDOExceptionを使用して、それをキャッチし、symfonyの2.1+で

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

を示唆したステートメントを使用します、それをキャッチするために、私は(私はsymfonyのに新たなんだ)どこでどのようにそれを書くことは本当にわからないけど、ドキュメントから、私は '注釈を得ました@ ORM \ Column(..、unique = true) 'を返しますが、それでもSQLエラーが発生します。興味深いのは、このエラーはDoctrineではなくMySQLであるということです。 Doctrineは、(パフォーマンスに関する限り)許容できないデータベース内の個々のチェックを行わずに値が存在するかどうかを知る方法がありません。 –

+0

一意のアノテーションがその列に一意のインデックスを指定するため、エラーはMySQLから発生します。データをデータベースに挿入する前に、データが正しいことを検証する必要があります。 (複数の)例外をキャッチするのは、コストのかかる操作です。挿入に先立ってデータを検証するのは良いことです。 –

+0

私は理解していますが、コストのかかるデータベースチェックを行わずに、エンティティ内のフィールドがデータベース内で一意であることをどのように検証できますか? –

12

symfony docsから採取)。

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

Doctrineの前にバックスラッシュを付けることを忘れないでください。 –

6

Symfony 2.1でPDOExceptionがスローされていることに注意してください。親関係を持つエントリを削除します。しかし、あなたはihsan

によって
try { 
     $em = $this->getDoctrine()->getEntityManager(); 
     $em->remove($entity); 
     $em->flush(); 
    } catch(\Doctrine\DBAL\DBALException $e) 
    { 
     // ... 
    } 
関連する問題