Laravel 验证:存在附加列条件 - 自定义验证规则

在 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存在于表中(字段)gamesid
  • team1_id存在于表(字段)中,并且列(在表中)必须等于输入的值。teamsidgame_idteamsgame_id
  • 如上所述team2_id

因此,如果在我的表单中,我输入了 ,我希望能够确保团队表中的记录对于两者并且具有 的值。1game_idteam1_idteam2_id1game_id

我希望这是有道理的。

谢谢


答案 1

从Laravel 5.3 +中,您可以向存在和唯一的规则添加自定义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 子句的第二列。

这非常方便,因为现在我不再需要自定义验证规则。


答案 2

您需要一个自定义验证规则,我将为此创建一个单独的类。但为了简洁起见,这里使用内联闭包几乎是相同的:

// 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'
);

推荐