当我尝试用分数值保存类型为"percent"的Symfony 2.8表单字段时,验证返回
此值不应为空。
我已经按照说明在我的实体中设置了该字段:
/**
* @var decimal
*
* @ORMColumn(
name="total_percent",
type="decimal",
precision=14,
scale=8,
nullable=false
)
* @AssertNotNull()
*/
private $percent;
我创建我的字段如下:
->add('percent',
PercentType::class,
array(
'scale' => 8,
'attr' => array('class' => 'percent_field'))
)
我已经仔细检查了数据库,我可以创建带有分数的条目,所以问题似乎出在 Symfony 的表单上。但是,我在代码中找不到问题。 有没有人成功实施了这一点。从本质上讲,我希望能够节省1.5%的百分比。 任何建设性的想法(与手头的问题有关)都值得赞赏。
如教义文档中所述:
精度:小数(精确数字)列的精度(适用) 仅适用于十进制列),这是最大位数 为值存储。
小数位数:小数(精确数字)列的小数位数(仅适用于 对于十进制列),表示 小数点右侧,并且不得大于精度。
要存储简单的百分比值(如1.5
%)和从0.0
到100.0
的相对(正)范围,您应该修改列映射:
/**
* @var decimal
*
* @ORMColumn(
* name="total_percent",
* type="decimal",
* precision=4, # <-- THIS IS NEEDED TO BE ALLOWED TO STORE ALSO 100.0,
* scale=1, # <-- THIS ALLOWS ONLY 1 DECIMAL
* nullable=false
* )
* @AssertNotNull()
* @AssertRange(
* min = 0,
* max = 100,
* minMessage = "Min % is 0",
* maxMessage = "Max % is 100"
* )
*/
private $percent;
和表单字段:
->add('percent',
PercentType::class,
array(
'type' => 'integer', # <-- SET THE TYPE AS INTEGER!
'scale' => 1,
'attr' => array('class' => 'percent_field')
)
)
为了避免值过高,100.0
使用Range
约束,如我的示例所示。
在我的测试中,这种配置运行良好,允许用逗号分隔的小数,如"34,2
"或"1,5
",所有像"23,5543
"的值将四舍五入到缺陷或多余的最接近的值(在这种情况下将是"23,6
")。