symfony2表单中的空白字段有些奇怪

时间:2012-04-23 19:56:30

标签: forms symfony doctrine-orm

当我发送带有空白字段的表单时,我收到错误SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'image' cannot be null。修复它的唯一方法是找到实体文件中的默认值:

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

并像这样更改setter:

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

我认为这是非常的... 这有什么解释吗?还有另一种方法吗?     }

2 个答案:

答案 0 :(得分:7)

如果不需要字段image,则可以将其设置为nullable,以便Doctrine知道并将该列设置为可为空。

这样,不会违反约束,因为该字段可以为null。要使字段可以使用Doctrine注释构建为空,只需在nullable = true定义中添加ORM\Column,如下所示:

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

默认情况下,所有列都是nullable=false,因此当尝试在其中保留空值时,它们将抛出一个constaint验证异常。

的问候,
马特

答案 1 :(得分:2)

为什么在这里部分回答:

Symfony2 forms interpret blank strings as nulls

此代码绕过它,因为当Symfony将$image设置为null并调用$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;
    }
}

这是更明确的(谁还想要那个奇怪的空语句?)。它表达了你的意图,$this->image不能为空(如果你不使它可以为空,它与数据库定义匹配)

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

无论哪种方式,您都需要初始化$this->image,否则默认为null