我有一个包含各种字段的Symfony2表单,其中包括一个名为recap的可选文本字段。
当其中包含一些文本时,此recap字段可以很好地保存,但当该字段保留为空时,我会收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'recap' cannot be null没错-列recap不能为null。我故意把它设置成这样。Null的意思是未知。当用户将recap留空时,recap的值不是未知的;它是空的。
我的问题是,当recap为空时,如何让Symfony将其保存为'',而不是null。
发布于 2012-03-29 23:45:27
转到您的实体并转到变量的声明。
/**
* @var string $name
*
* @ORM\Column(type="string", length=50)
*/
public $recap = '';您可以为$recap指定默认值。
或者,当您使用函数setRecap时,您可以检查是否为空或未设置,并设置您期望的值。
public function setRecap($recap) {
$this->recap = !isset($recap) ? '': $recap;
}或者您将表单类型中的默认值设置为“”,但我认为这不是您所期望的。
发布于 2012-08-12 20:13:32
是的,花了很多时间;-(“转换”是在组件Form.php第1113行中硬编码的!
private function viewToNorm($value)
{
$transformers = $this->config->getViewTransformers();
if (!$transformers) {
return '' === $value ? null : $value;
}
for ($i = count($transformers) - 1; $i >= 0; --$i) {
$value = $transformers[$i]->reverseTransform($value);
}
return $value;
}在我看来,这是一个很大的错误(因为这是DataTransformer的角色,而不是Form)。因此,解决方案是创建您自己的DataTransformer并将其与文本类型相关联。目前我在Symfony2上浪费了太多时间,总是在寻找这些小技巧的来源;-(
发布于 2015-05-20 23:56:35
对于这个问题,我有另一个解决方案:
创建虚拟类
class EmptyString {
public function __toString() {
return '';
}
}和set
$builder->add('recap', 'text', [
'empty_data' => new EmptyString(),
]);当实体存储到数据库时,它会自动转换为空字符串。
https://stackoverflow.com/questions/9928702
复制相似问题