在 Laravel 中指定存在验证规则时是否可以引用另一个字段?我希望能够说输入 a 必须存在于表 a 中,输入 b 必须存在于表 b 中,并且表 b 中列 x 的值必须等于输入 a。
通过示例进行最佳解释:
public $rules = array(
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id,game_id,<game_id input value here>',
'team2_id' => 'required|exists:teams,id,game_id,<game_id input value here>'
);
因此,通过我的验证规则,我希望能够确保:
game_id
存在于 games
表(id
字段)team1_id
存在于 teams
表(id
字段)中,并且 game_id
列(在 teams
表中)必须等于 game_id
输入的值。team2_id
因此,如果在我的表单中,我为
1
输入了 game_id
,我希望能够确保团队表中 team1_id
和 team2_id
的记录都具有 1
的值
game_id
.
我希望这是有道理的。
谢谢
从 Laravel 5.3+ 开始,您可以向 exists 和 unique 规则添加自定义 where 子句。
这是我的场景:我有一个电子邮件验证表,我想确保通过的机器码和激活码存在于同一行。
一定要
use Illuminate\Validation\Rule;
$activationCode = $request->activation_code;
$rules = [
'mc' => [
'required',
Rule::exists('email_verifications', 'machineCode')
->where('activationCode', $activationCode),
],
'activation_code' => 'required|integer|min:5',
'operating_system' => 'required|alpha_num|max:45'
];
exists 方法中的第一个参数是表,第二个参数是我用于“mc”字段的自定义列名称。我通过了第二列,我想检查 where 子句。
这非常方便,因为现在我不再需要自定义验证规则。
您想要一个自定义验证规则,我会为此创建一个单独的类。但为了简洁起见,使用内联闭包几乎是一样的:
// give it meaningful name, I'll go with game_fixture as an example
Validator::extend('game_fixture', function ($attribute, $value, $parameters, $validator)
{
if (count($parameters) < 4)
{
throw new \InvalidArgumentException("Validation rule game_fixture requires 4 parameters.");
}
$input = $validator->getData();
$verifier = $validator->getPresenceVerifier();
$collection = $parameters[0];
$column = $parameters[1];
$extra = [$parameters[2] => array_get($input, $parameters[3])];
$count = $verifier->getMultiCount($collection, $column, (array) $value, $extra);
return $count >= 1;
});
然后简单地使用这个:
$rules = array(
'game_id' => 'required|exists:games,id',
// last parameter here refers to the 'game_id' value passed to the validator
'team1_id' => 'required|game_fixture:teams,id,game_id,game_id',
'team2_id' => 'required|game_fixture:teams,id,game_id,game_id'
);
由于您的规则是模型属性,因此您需要在运行验证器之前对它们进行一些更改。
您可以将规则更改为:
public $rules = array(
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id,game_id,{$game_id}',
'team2_id' => 'required|exists:teams,id,game_id,{$game_id}'
);
现在您需要使用循环来插入正确的值而不是
{$game_id}
字符串。
我可以向您展示我在编辑规则的情况下是如何做到的:
public function validate($data, $translation, $editId = null)
{
$rules = $this->rules;
$rules = array_intersect_key($rules, $data);
foreach ($rules as $k => $v) {
$rules[$k] = str_replace('{,id}',is_null($editId) ? '' : ','.$editId , $v);
}
$v = Validator::make($data, $rules, $translation);
if ($v->fails())
{
$this->errors = $v->errors();
return false;
}
return true;
}
您可以在您的情况下执行相同的操作,将
{$game_id}
更改为 $data['game_id']
(在我的情况下,我将 {,id}
更改为 ,$editId
编辑
当然,如果您没有将
$rules
设置为属性,您可以简单地执行以下操作:
$rules = array(
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id,game_id,'.$data['game_id'],
'team2_id' => 'required|exists:teams,id,game_id,'.$data['game_id']
);
在您拥有数据集的地方。
检查 NULL 条件
'game_id' => 'required|exists:games,id,another_column,NULL',
您可以使用 (,) 列名称和值添加更多条件。
另一种方法你可以尝试这些
public $rules = array(
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id,game_id,'.$request->game_id,
'team2_id' => 'required|exists:teams,id,game_id,'.$request->game_id
);
试试这个,它对我有用
'email'=>'required|unique:admintable,Email,'.$adminid.',admin_id',
如果其他人仍在 Laravel 6 或更高版本中寻找更好的解决方案,您可以简单地添加带有“存在”规则的字段名称,如下所示。
$rules = $request->validate([
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id',
'team2_id' => 'required|exists:teams,id'
]);
并检查 game_id 是否存在于“teams”表中,您可以使用 IN: 规则。
类似这样的事情:
$rules = $request->validate([
'game_id' => 'required|exists:games,id',
'team1_id' => 'required|exists:teams,id|in:games',
'team2_id' => 'required|exists:teams,id|in:games',
]);
我希望这会对某人有所帮助。
您可以在 Rules 方法中获得一些值,例如 $这个->值 然后针对该值使用与字符串相同的规则
$pdf = $request->file('resume')->getClientOriginalName();
if (file_exists(public_path('PDF/'.$pdf))) {
return back()->withErrors(["resume" => "This File is Already Exits"])->withInput();
}else{
$request->resume->move(public_path('PDF'), $pdf);
}
您必须添加像这样的错误消息,这对我有用