Symfony 2.8:分数的百分比表单字段验证不正确

时间:2017-04-25 22:08:05

标签: forms symfony validation

当我尝试使用小数值保存“百分比”类型的Symfony 2.8表单字段时,验证返回

  

此值不应为null。

我按照说明在我的实体中设置了字段:

/**
 * @var decimal
 *
 * @ORM\Column(
          name="total_percent", 
          type="decimal", 
          precision=14, 
          scale=8, 
          nullable=false
   )
 * @Assert\NotNull()
 */
private $percent;

我创建了我的字段:

->add('percent', 
      PercentType::class, 
      array(
          'scale' => 8, 
          'attr' => array('class' => 'percent_field'))
      )

我已经仔细检查了数据库,我可以使用分数创建条目,因此问题似乎与Symfony的形式有关。但是,我在代码中找不到该问题。 有没有人成功实现过这个。从本质上讲,我希望能够节省1.5%的百分比。 任何有建设性的想法(与手头的问题有关)都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

Doctrine documentation中所述:

  

精度:小数(精确数字)列的精度(适用   仅适用于十进制列),即最大位数   存储为值。

     

比例:小数(精确数字)列的比例(仅适用   对于十进制列),表示到的数字位数   小数点右边,不得大于精度。

要存储一个简单的百分比值,例如1.5%以及从0.0100.0的相对(正)范围,您应该修改列映射:

/**
 * @var decimal
 *
 * @ORM\Column(
 *     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
 *  )
 * @Assert\NotNull()
 * @Assert\Range(
 *      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; 34,2&#34;或&#34; 1,5&#34;以及&#34; 23,5543&#34;等所有值将四舍五入到最接近缺陷或超额的值(在这种情况下将是&#34; 23,6&#34;)。