2017-04-25 56 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會在將數據存儲到數據庫之前轉換「視圖」值)。 –