2017-10-31 13 views
0

UniqueEntityに複数のフィールドがあることを確認する際に問題があります。 は、私は、次のコードを持っている:symfonyフォームが複数のuniqueEntityフィールドを検証できない

私は同じLANGUAGE_IDを投稿しようとしていますし、私は私もこの回答 hereをチェックするにsymfonyの documentation確認 PDOException > PDOException > UniqueConstraintViolationException

を取得していますAPP_IDが、それはしない

/** 
* @ORM\Entity() 
* @ORM\Table(name="app_languages", uniqueConstraints={@ORM\UniqueConstraint(name="IDX_LANGUAGE_CONSTRAINT", columns={"language_id", "app_id"})}) 
* 
* @UniqueEntity(fields={"languages", "app"}) 
*/ 
class AppLanguages extends AbstractEntity 

それはすべきだ。 名前空間Symfony\Bridge\Doctrine\Validator\Constraintsの下で行われ、それでも、これは...

答えて

0

複数のものに動作していないため検証もあります:

まず、私はあなたがこれまでのように示されてきたものでは潜在的なタイプミスの問題を見ることができますが、あなたのUniqueEntity注釈であなたはfielの "languages"(複数形)を参照しているのに対し、Tableの制約注釈では "language_id"(単数)の列を参照しているので、フィールド/列の定義を二重チェックしてみてください。あなたの制約を作成しようとしている

2通りの方法が異なる目的を持っている:

@ORM\UniqueConstraint 

SQL UNIQUE constraintを追加することで、データベースのスキーマの変更を生成するためのものです。これにより、データベースエンジンは上記のテーブルのすべてのエントリをチェックし、PDOによってPHP出力にリレーできるエラー(例:MySQLの場合#1062エラー)を生成します。一方

@UniqueEntity 

は、UniqueEntityはあなたのPHPのエンティティを検証するためのものです(やってます$ form->はisValid()exemple用)に似たすべての結果がある場合は、データベースに対してSELECT文を発射してチェックすることにより提出された値。

あなたが戻ってきた例外を理解することは、どの制約が問題を正確に引き起こし、原因を突き止めるのかを理解するのに役立ちます(既にベースにあるデータの問題ですか?)。

また、何をする必要があるかに応じて、2つの制約を含める必要はなく、@UniqueEntityまたは@UniqueConstraintのみを使用する必要があります。

EDIT:

あなたがあなた自身のリポジトリメソッドを作成することにより、検証に使用要求を強制するrepositorymethodオプションを使用することを試みることができます。

希望これは、私はそれが検証に合格したもの2つのフィールドに対してのみUniqueEntityを使用していた場合に問題があるだけでなく

+0

に役立ちます。だから私は今、制約のための安全のためだけに追加し、フォームのエラーを設定するtryキャッチを使用して(私はそれがエレガントではないが、それが動作します..)私はすでにデータベースにデータがあります。 app_id = 1 lang_id = 1 - > saved app_id = 1 lang_id = 2 - > saved lang_id = 2 - >失敗したとします。フォームの検証が機能しない場合は、SQLの制約が今のところトリックを行う必要があります。 –

+0

@HerrNentu '私の悪いところは、私が納得していなかったことです(あなたがPDO例外を取得していた理由を理解できなかったと思っていました)。あなたの問題を説明するかもしれない興味深い結論を持つ、 :[リンク](https://github.com/symfony/symfony/issues/6727) –

関連する問題