【问题标题】:How to validate only part of a value I'm getting through a get request?如何仅验证我通过获取请求获得的部分值?
【发布时间】:2019-05-26 18:11:38
【问题描述】:

我想从 get 请求中获取两个值,然后我将使用 explode 分别检索它们中的每一个。但是,这意味着我在使用explode 之前得到的值不是表所独有的(因为它是一个化合物,因此它不是表中的现有值)。如何使用 validate 来避免重复?

我尝试使用 SQL 约束使列唯一,但这意味着当用户输入重复项时我会得到一个异常页面。我想改用验证,所以我收到一条错误消息。

public function store(Request $request)
    {
        $this->validate($request, [
            'idProduit' => 'unique:stocks', 
            'produit' => 'required|unique:stocks',
            'quantite' => 'required'
        ]);
        $produit = explode("|",$request->get('produit'));
        $stock = new Stock;
        $stock->idProduit = $produit[0];
        $stock->produit = $produit[1];
        $stock->quantite = $request->input('quantite');
        $stock->save();

        return redirect('/stocks/')->with('success', 'Entrée de stock ajoutée à la base de données');
    }

我实际上没有收到任何错误消息,但它允许我在数据库中添加重复项,我知道原因:该值是数据库中不存在的化合物,因此唯一验证我写不能只捕获其中一部分的重复项。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    您可以创建自定义验证规则类或使用验证器https://laravel.com/docs/5.8/validation#custom-validation-rules

    类似的东西:

    Validator::make($request->all(), [
        'quantite' => 'required',
        'produit' => [
            'required', 
            function ($attribute, $value, $fail) {
                $parts = explode('|', $value);
    
                if (!Stock::where('idProduit', $parts[0])->exists()) {
                    $fail('idProduit already exists.');
                }
    
                if (!Stock::where('produit', $parts[1])->exists()) {
                    $fail('produit already exists.');
                }
            }
        ],
    ])->validate();
    

    【讨论】:

      【解决方案2】:

      简单的方法:在验证之前分解并使用另外 2 个字段创建新的 $request。结束了!!

      public function store(Request $request)
      {
          $produit = explode("|",$request->get('produit'));
          $request->request->add(['idProduit' => $produit[0]]);
          $request->request->add(['produit' => $produit[1]]);
      
          $this->validate($request, [
              'idProduit' => 'unique:stocks', 
              'produit' => 'required|unique:stocks',
              'quantite' => 'required'
          ]);
      
          $stock = new Stock;
          $stock->idProduit = $produit[0];
          $stock->produit = $produit[1];
          $stock->quantite = $request->input('quantite');
          $stock->save();
      
          return redirect('/stocks/')->with('success', 'Entrée de stock ajoutée à la base de données');
      }
      

      【讨论】:

      • 看起来很漂亮,但不确定 explode 在第二个参数中接受 null。
      • :) 它接受任何参数,但为数组 [0] 返回一个空字符串 :: PHP.net Docs : 如果 delimiter 是一个空字符串 (""),explode() 将返回 FALSE。如果 delimiter 包含字符串中不包含的值,并且使用了负数限制,则返回一个空数组,否则返回一个包含字符串的数组。
      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多