2

我正在使用 laravel 开发库存系统。

一切都按预期进行,直到我遇到表单验证问题。

所以下面是我的订单控制器代码中的插入功能,

public function insert(Request $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {
      $productSku = $request->get('productSku') [$key];
      $product = \App\Product::find($productSku);
      $rules = [
              'orderId' => 'unique:orders',
              'customerId' => 'required',
              'orderStatusId' => 'required',
              'paymentMethodId' => 'required',
              'uomId.*' => 'required',
              'productSku.*' => 'required',
              'productQty.*' => 'required',
              // 'lte' means Less Than or Equal to available stock quantity
              'orderQty.*' => 
              'required|numeric|min:1|lte:'.$product['productQty'],
              'orderPrice.*' => 'required'
          ];

      $messages = [
                'customerId.required' => 'Please select Customer',
                'orderStatusId.required' => 'Please select Order Status',
                'paymentMethodId.required' => 'Please select Payment Method',
                'uomId.*.required' => 'Please select UOM',
                'productSku.*.required' => 'Please select Product',
                'orderQty.*.required' => 'Please enter Order Quantity',
                'orderQty.*.min' => 'Quantity must be at least 1',
                'orderQty.*.lte' => 'Quantity of product no. 
                '.$product['productSku'].' must be not greater than 
                '.$product['productQty'],
                'orderPrice.*.required' => 'Please enter Product Price'
          ];

      // Validate "Rules" and "Messages" to running.
      $this->validate($request, $rules, $messages); 

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how 
      much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", 
      $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
  }

这是我在 create.blade.php 中的 html 代码,

https://pastebin.com/cn2X1aVL

如您所见,有“orderQty”和“productQty”字段。

因此,我尝试使用动态“productQty”字段验证动态“orderQty”字段,以防止用户在“productQty”字段中输入大于值的数量。

根据大多数 laravel 社区的推荐,我还在我的代码中的 $rules 数组中使用 lte(小于等于)命令。

这个东西只适用于单个输入,但不适用于动态添加的输入。请参阅下图,您可以看到,产品的第二个输入没有按照我的要求正确验证。

创建刀片文件

甚至错误消息也没有按需要显示动态消息。

请帮我找出问题所在。我尝试了很多解决方案,但仍然无法正常工作。:'(

4

3 回答 3

7

在测试了回答者建议的所有可能解决方案后,

现在它固定了!

这是我在 OrderController 中的插入功能代码,

public function insert(OrderRequest $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);

    $validated = $request->validated();
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
}

这是我在 OrderRequest 中的代码

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;

class OrderRequest extends FormRequest
{
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{ 
    $rules = [
        'name' => 'required',
    ];

    foreach($this->request->get('productSku') as $key => $val)
    {
        $product = \App\Product::find($val);
        $rules['orderId'] = 'unique:orders'; 
        $rules['customerId'] = 'required';
        $rules['orderStatusId'] = 'required';
        $rules['paymentMethodId'] = 'required';
        $rules['uomId'] = 'required';
        $rules['productSku.'.$key] = 'required';
        $rules['orderQty.'.$key] = 'required|numeric|min:1|lte:'.$product['productQty'];
        $rules['orderPrice.'.$key] = 'required';
    }
    return $rules;
}

public function messages() 
{
    $messages = [];
      foreach($this->request->get('productSku') as $key => $val)
      {
        $product = \App\Product::find($val);
        $messages['orderQty.'.$key.'.lte'] = 'Quantity of product no. 
'.$product['productSku'].' must be not greater than '.$product['productQty'];
      }
      return $messages;
}
}

如您所见,我创建了自己的请求文件 (OrderRequest) 并从 OrderController 调用它。

在 OrderRequest 文件中,我创建了一个 foreach 循环,以确保验证适用于我的动态字段,包​​括其中的 lte/gte 规则。

对于自定义消息,我还制作了一个 foreach 循环,因为我想动态显示错误,如下所示(参考图片),

创建刀片文件

感谢大家向我提出各种可能的解决方案来解决这个问题。:D

于 2018-11-19T06:39:12.320 回答
0

试试这个

'orderQty.*' => 'required|numeric|min:1|max:'.$product['productQty'] 
于 2018-11-19T03:07:55.367 回答
-1

您可以创建自己的请求:

php artisan make:request {请求名称}

然后您可以像这些文档中所示的默认请求一样使用此请求

https://laravel.com/docs/5.7/requests

如果您添加另一个名为“消息”的方法,您可以添加如下消息:

public function messages() {
    return [
        '{variable name}.{validation method}' => '{message to user}'
    ]
}

然后你会得到一个带有错误消息的 ajax 响应。

希望有帮助

更新

上述建议是最佳实践,因为您通过空白请求传递所有数据

改变:

'required|numeric|min:1|lte:'.$product['productQty'],

至:

'required|numeric|min:1|lte:productQty',

这告诉验证器 orderQty 必须小于或等于 productQty 的输入

于 2018-11-19T02:40:01.020 回答