📜  具有多列 laravel 验证的唯一检查 - PHP (1)

📅  最后修改于: 2023-12-03 14:50:07.159000             🧑  作者: Mango

Laravel中具有多列验证的唯一检查

在Laravel中,有时需要检查表格中多个列中的唯一值。虽然可以使用unique验证规则检查单个列的唯一性,但是没有提供原生验证规则来检查多个列的唯一性。在这种情况下,您可以使用Laravel的自定义验证规则来检查表中多列唯一性。下面是一个实现这种验证的示例代码:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

Validator::extend('unique_columns', function ($attribute, $value, $parameters, $validator) {
    $query = DB::table($parameters[0])->where($parameters[1], $value)->where($parameters[2], $validator->getData()[$parameters[2]]);
    if (count($parameters) > 3) {
        $query->where($parameters[3], $validator->getData()[$parameters[3]]);
    }
    $count = $query->count();
    return $count === 0;
});

代码中,我们定义了一个名为unique_columns的自定义验证规则。该规则将接受四个参数:表名,要检查唯一性的第一个列名,要检查唯一性的第二个列名以及可选的第三列名。

规则的核心部分是以下代码行:

$query = DB::table($parameters[0])->where($parameters[1], $value)->where($parameters[2], $validator->getData()[$parameters[2]]);

此行创建一个Eloquent查询生成器,用于从指定的表中检索符合以下条件的行:

  • 第一个列的值等于要验证的值。
  • 第二个列的值等于当前请求中具有相同列名的值。

如果存在可选的第三列,它将使用类似的方式添加到查询中。

接下来,我们计算查询结果的计数,并返回true或false,具体取决于查询结果是否为0,即查询是否找到任何匹配项。

$count = $query->count();
return $count === 0;

现在可以在Laravel中使用unique_columns自定义验证函数来检查多列验证规则。例如,以下代码将验证在users表中的emailname列中是否存在带有特定值的行:

$validator = Validator::make($request->all(), [
    'email' => 'required|email',
    'name' => 'required',
    'password' => 'required',
    'confirmed_password' => 'required',
    'username' => ['required', 'unique_columns:users,name,email', 'alpha_dash'],
]);

在以上示例中,unique_columns规则是作为最后一个验证规则来调用的。此时,我们将表名作为第一个参数传递,要检查唯一性的所有列名作为后续参数传递。

希望这个示例有助于您在Laravel中检查多个列的唯一性!