2012-04-23 17 views
3

空白のフィールドがあるフォームを送信すると、エラーSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'image' cannot be nullが表示されます。symfony2フォームの空白のフィールドで何か変なことがあります

* @ORM\Column(type="string", length=100) 
*/ 
protected $image=""; 

と、このようなセッター変更::私が見つけたこと、それを修正する唯一の方法は、実体ファイルにデフォルト値を作ることです、私はそれが非常にstarngeだと思い

public function setImage($image){ 
if(!isset($image)) { 
//its really empty but it works only in this way  
} 
    else { 
    $this->image = $image; 
    } 

を.. これにはどんな説明がありますか?それを行う別の方法がありますか? }

+0

プロパティ 'image'は必須ですか?そうでなければ、@ORM \ Column(type = "string"、length = 100、nullable = true) 'の代わりにこの定義を使うことができます。 – Matt

+0

必須ではありません。私はあなたの提案をし、スキーマを更新し、実際にそれが動作します。ありがとうございました! – s976

+0

私はそれを答えるつもりです、あなたはそれを受け入れることができます。 – Matt

答えて

7

フィールドがimageである必要がない場合は、nullableと設定することができます。そのため、Doctrineはそれを認識し、そのカラムをnullに設定できるように設定します。

このようにして、フィールドはnullでもかまいませんので、制約に違反しません。 Doctrineの注釈付きフィールドのNULL可能にするには、ちょうどこのようORM\Column定義でnullable = trueを追加します。デフォルトでは

@ORM\Column(type="string", length=100, nullable=true) 

、すべての列がnullable=falseあり、それにnull値を持続しようとしたときので、彼らはconstaint検証例外がスローされます。

よろしく、
マット

+1

しかし、なぜ空のテキストフィールドが '' ''(空の文字列)ではなく ''ヌルですか? – apfelbox

+0

分かりませんが、この時点で掘り下げたことはありません。多分Symfony2のデザイン決定。彼らはオプションを提供することによってフォームレベルでそれをカスタマイズする可能性があります... – Matt

+0

私の答えを参照してください "理由" – Matt

2

理由を部分的にここで答えている:

Symfony2 forms interpret blank strings as nulls

このコードは、それを回避してsymfonyはnullに$imageを設定し、$entity->setImage(null)を呼び出したときに、このコードは変更されませんので、 $imageメンバー。

public function setImage($image){ 
    if(!isset($image)) { 
     // $image is null, symfony was trying to set $this->image to null, prevent it 
    } else { 
     $this->image = $image; 
    } 
} 

これはより明示的です(とにかく、奇妙な空文が必要ですか?)。これは、いずれかの方法で

public function setImage($image){ 
    if(isset($image)) { 
     // $image not null, go ahead and use it 
     $this->image = $image; 
    } 
} 

(あなたはそれがNULL可能にしない場合は、データベースの定義と一致する)$this->imageはNULLにすることはできませんことを、あなたの意図を表現し、あなたはそれ以外の場合はnullがデフォルトになります$this->imageを初期化する必要があります。

+1

面白い、ダブルマットの答え:) – Matt

関連する問題