gpt4 book ai didi

php - Symfony 表单字段属性 empty_data 被忽略

转载 作者:可可西里 更新时间:2023-10-31 22:13:10 27 4
gpt4 key购买 nike

根据Symfony 2.4 Documentation ,任何不需要但提交时没有任何值(选择字段的默认值或文本字段的空值)的表单字段将被保存到具有 NULL 值的实体。因此,如果您的实体字段被定义为 NOT NULL(例如,not nullable=true),当您持久化该实体时,您将得到一个讨厌的错误:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'shell' cannot be null

所以文档说,如果您不希望它使用 NULL 作为默认值,您可以在文本或选择字段上指定 empty_data 属性。但是,这对我不起作用。

实体字段(不可为空):

/**
* @ORM\Column(type="string")
*/
protected $shell = '';

表单生成器(非必需):

->add('shell', 'choice', array(
'label' => 'Shell',
'choices' => array('shell' => 'Fancy Pants'),
'required' => false,
'empty_data' => ''
))

我是否误解了这个 empty_data 属性?我在其他地方错过了一些重要的设置吗?推荐的做法是什么?

更新

Github ticket解释说这是 2012 年的问题,目前尚未修复。

这意味着每个使用表单生成器的人都被迫将任何不需要的字段设为可为空的字段?对于框架来说,这似乎很固执己见……当默认的 '' 或 0 没有唯一含义并且我们不需要 NULL 时,我们不想使用 NULL 的原因有很多。对于许多查询,必须同时检查 field=0 或 field=NULL 是否存在,这是一件很痛苦的事情。

是否有其他人正在使用的更好的解决方案?

最佳答案

我按照建议的方式进行操作,但在 Entity 类中设置了默认值。因此,实体不是设置 null,而是修复它设置 0 或其他值。

public function __construct() { 
$this->shell = 0;
}

或者,您可以在 setter 中处理它:

public function setShell($shell) {
$this->shell = $shell;

if ( !is_numeric($shell) ) {
$this->shell = 0;
}
return $this;
}

也许不是最佳实践,但它可以使值不为空。

关于php - Symfony 表单字段属性 empty_data 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com