2017-04-25 47 views
0

当我尝试保存类型“百分比”的Symfony的2.8表单域与分数值,验证返回Symfony的2.8:百分比表单字段验证不正确的分数

此值不能为空。

我已经设置了场在我的实体按指示:

/** 
* @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

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,2”或“1,5”等“23,5543”将圆整缺陷或超过最接近的值的所有值separed允许十进制(在这种情况下将是“23,6”)。

+0

@roland我不确定验证错误是否由于错误的设置而导致的,但是您的映射肯定是错误的。如果错误不消失,请查看Symfony profiler - >表单以查看传递给表单的数据。让我知道:-) –

+0

Symfony将“百分比”字段值转换为其实际值,例如, 1.5%在数据库中存储为0.015(这可以工作,我可以手动将该值添加到数据库)。所以在你的情况下,我将无法存储1.5(precision = 3,scale = 1)。因为它将被存储为0.015。当scale = 1时,这会使它0.0,这将触发非空错误? – roland

+0

@roland我用完整的工作配置更新了我的答案。PS:请记住使用**逗号**“”插入值,而不是点(Symfony会在将数据存储到数据库之前转换“视图”值)。 –