Laravel如何验证一行中的数据,而不是检查整个表

Posted

技术标签:

【中文标题】Laravel如何验证一行中的数据,而不是检查整个表【英文标题】:Laravel how to validate data in one row, not checking in whole table 【发布时间】:2017-12-16 00:24:31 【问题描述】:

我不确定我是否简要解释了问题所在。 我有一个用户投票表格,其中用户通过他的名字、姓氏、母亲的姓氏和 ID。

我还有一个表users 存储所有这些数据。昨天我发现了一个错误或者我误解了 laravel 验证的工作原理,因为它每次找到表中存在的所有数据时都会通过提交。

这是一个有两条记录的表。

示例

我对验证的期望是检查 ID=98111091239 name=Andrzej surname=Pianowski 和 Mother surname =Mila,并且只有当一切正确并且存在于一行中时,才能进行投票。

相反,我可以从第一行传递 ID,从第二行传递其他内容,它还允许用户投票。 这是一个错误,laravel 以这种方式工作还是什么? 我真的很期待任何提示、帮助和建议。

这是我正在使用的验证规则

  /*This validates whether all data is correct  */
   $validator = Validator::make($request->all(),[
   //check whether such pesel exists in votes and in voters
       'pesel' =>'required|exists:wyborca|max:11|min:11',
       'imie' =>'required|exists:wyborca|max:64|min:2',
       'nazwisko' => 'required|exists:wyborca|max:128|min:2',
       'nazwisko_matki' => 'required|exists:wyborca|max:128|min:2'
       ]);
  if($validator->fails())
  
    return back()
      ->with('errors','Wprowadzono nieprawidłowe dane')
      ->withInput();
  

【问题讨论】:

Laravel validation: exists with additional column condition - custom validation rule的可能重复 不,这是不同的主题 【参考方案1】:

验证器似乎正在通过,因为这些值可能存在于多条记录中,而不仅仅是一条记录。

一种解决方案是验证以确保请求中存在所有字段,然后执行简单的 Eloquent 查询以检查记录是否存在:

$user = App\User::where('id', $request->id)
    ->where('name', $request->name)
    ->where('surname', $request->surname)
    ->where('mother', $request->mother)
    ->exists(); //true or false

if($user)
//vote


return response()->json(['error' => 'user not found'], 404);

如果确实存在,则进行投票,否则返回错误。

【讨论】:

以上是关于Laravel如何验证一行中的数据,而不是检查整个表的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 laravel 中的用户模型以使用其他表进行身份验证而不是用户?

如何检查用户是不是通过 Laravel 上的 cookie 会话进行身份验证?

如何使用 laravel 8 验证来自另一个(买家)表的数据(请求中)

如何从 Laravel 5.1 中的表而不是“用户”表中对用户进行身份验证?

从一个表复制到另一个表,如何对整个数据集而不是单独的行强制执行外键检查?

Laravel 验证 - 如何检查给定数组中是不是存在值?