Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel验证:存在附加列条件-自定义验证规则_Php_Validation_Laravel_Laravel 4_Laravel Validation - Fatal编程技术网

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

Php Laravel验证:存在附加列条件-自定义验证规则,php,validation,laravel,laravel-4,laravel-validation,Php,Validation,Laravel,Laravel 4,Laravel Validation,在Laravel中指定exists验证规则时,是否有方法引用其他字段?我想说输入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>',

在Laravel中指定exists验证规则时,是否有方法引用其他字段?我想说输入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>'
);
public$rules=array(
'game_id'=>'必需|存在:games,id',
“team1_id”=>“必需”|存在:teams,id,game_id,”,
“team2_id”=>“必需”|存在:teams,id,game_id,”
);
因此,根据我的验证规则,我希望能够确保:

  • game\u id
    存在于
    games
    表中(
    id
    字段)
  • team1\u id
    存在于
    teams
    表(
    id
    字段)中,并且
    game\u id
    列(在
    teams
    表中)必须等于
    game\u id
    输入的值
  • 如上所述的
    team2\u id
因此,如果在我的表单中,我为
game\u id
输入了
1
,我希望能够确保团队表中
team1\u id
team2\u id
的记录都具有
game\u id
的值
1

我希望这是有道理的


谢谢

因为您的规则是模型属性,所以您需要在运行validator之前对它们进行一些更改

您可以将规则更改为:

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\u 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\u id}
更改为
$data['game\u 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']
);
在您拥有数据集的地方。

您想要一个,我将为此创建一个单独的类。但为了简洁起见,这里使用内联闭包的方法基本相同:

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

从Laravel 5.3+中,您可以将自定义where子句添加到

下面是我的场景:我有一个电子邮件验证表,我想确保传递的机器代码和激活代码存在于同一行

确保
使用照明\验证\规则;

$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子句的第二列


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

试试这个,它对我很有用

'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'
]);
要检查“团队”表上是否存在游戏id,可以使用:rule

诸如此类:

$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',
]);

我希望这会对某人有所帮助。

另外,你能试试这些吗

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

检查空条件

'game_id' => 'required|exists:games,id,another_column,NULL',

您可以使用(,)列名和值添加更多条件。

这似乎非常有效,谢谢。我必须阅读自定义验证规则。应该将自定义验证类放在哪里?谢谢您可能有一些结构(或应该有)对于您的自定义代码,请将其放在那里。在Laravel 5中,您将创建一个新的服务提供商,但情况不同。我从5.3开始就使用此格式,它对我有效。我非常确定它是有效的,尽管我没有在他们的文档中看到它。$this->mymodel->create_rules['company_id']='required | exists:companys,id,type _id'。$id;这意味着company _id必须存在于其自己的表中,type _id字段的值必须为$id。@Jin非常感谢您,我已经测试了您的格式,它也可以与我一起使用(Larvel 7)我认为你的评论比我的评论好得多answer@AaronHill,你在LaravelV5.5中做得如何?@roerjo为什么你说它在Laravel5.5中不起作用?它在Laravel7.x中仍然起作用。顺便说一句,你不需要闭包,你只需执行
->where('activationCode',$activationCode')即可
如果管理员id来自请求,则直接不要使用此选项……这很容易受到变量注入的影响,有人可能会用一些管道和COMA欺骗您的验证……或者更糟的是,甚至会导致远程代码执行Hey@Tofandel call regex在调用验证之前只保留数字并删除adminid的其他字符;)或者只是使用类似的东西<代码>'email'=>['required','unique'=>['admintable','email',$adminid',admin\u id']]
'game_id' => 'required|exists:games,id,another_column,NULL',