验证前编辑请求数据

时间:2019-05-27 11:47:59

标签: php laravel model-view-controller

  

请求数据:

    [
        "invoice_data" => [
            ...
            "discount" => null,
        ],
        "product_credit" => [
            ...
            "discount" => null,
        ]
    ];
  

我要做什么

我正在尝试创建一个if statement来检查

$request -> invoice_data['discount'] == null,然后将其设置为 0

$request -> product_credit['discount'] == null,然后将其设置为 0

在验证过程之前,因为验证将失败。

  

我尝试过的事情:

我在Laravel中找到了一种名为prepareForValidation()的方法,它使用的是$this -> merge([...]),但我无法在invoice_data和{{1 }}。

3 个答案:

答案 0 :(得分:1)

设置属性默认值的方式比在请求有效负载中进行编辑的方法更简洁:

Model {
   protected $attributes = [
      'inovice_data' => 0,
      'discount' => 0,
      'product_credit' => 0
   ];
}

以这种方式,如果没有提供任何值,或者未定义的值或为null,则Eloquent会在填充db时将这些属性设置为已定义的默认值。

答案 1 :(得分:0)

<?php

$data =
[
        "invoice_data" => [
            "discount" => null,
        ],
        "product_credit" => [
            "discount" => null,
        ]
    ];

$keyWhitelist = [
    'invoice_data',
    'product_credit'
];

foreach ($data as $key => $entry) {

    if(!in_array($key, $keyWhitelist)) {
        continue;
    }

    if(key_exists('discount',$entry)) {
        if ($entry['discount'] === null) {
            $data[$key]['discount'] = 0;
        }
    }
}

var_export($data);

给出结果:

array (
  'invoice_data' => 
  array (
    'discount' => 0,
  ),
  'product_credit' => 
  array (
    'discount' => 0,
  ),
)

答案 2 :(得分:0)

您可以检查结果,然后在验证之前将其嫁接到请求。

if(!$request->filled(invoice_data.discount)){
  $request->merge(['invoice_data.discount' => 0]);
}