Laravel 验证:存在两列同一行

问题描述 投票:0回答:6

Laravel 中指定存在验证规则时是否可以引用另一个字段?

我的要求:

public function rules()
    {

        return [
            'numero_de_somme' => 'unique:personnels,numero_de_somme|exists:fonctionnaire,num_somme',
            'cin' => 'unique:personnels,cin|exists:fonctionnaire,cin',

        ];
    }

在我的验证规则中,我希望能够确保:

  • num_somme
    存在于
    fonctionnaire
    表中
  • cin
    存在于函数表中,并且
    cin
    输入必须是 在
    num_somme
  • 的同一行

num_somme:12345 辛:s89745

num_somme:78945 辛:U10125

解释:例如

  • 第一种情况,如果输入
    num_somme
    = 12345 且
    cin
    = U10125,则验证必须失败
  • 第二种情况,如果输入
    num_somme
    = 12345 且
    cin
    = s89745,则验证必须成功

我希望这是有道理的。

谢谢你

php laravel validation rules
6个回答
16
投票

您可以简单地使用这个:

'request_input' => exists:table,col,alternative_col_1,alternative_val_1,alternative_col_2,alternative_val_2, ...'

SQL查询如下:

select count(*) as aggregate from `table` where `id` = [request_input] and `alternative_col1` = "alternative_val1" and `alternative_col2` = "alternative_val2"

6
投票

我今天遇到了同样的需求,我想我有一个使用验证规则类的解决方案:规则示例

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

请务必包含

use Illuminate\Validation\Rule;

$activationCode = $request->activation_code;                                   

$rules = [                                                                     
    'mc' => [                                                                  
        'required',                                                            
        Rule::exists('email_verifications', 'machineCode')                     
        ->where(function ($query) use ($activationCode) {                      
            $query->where('activationCode', $activationCode);                  
        }),                                                                    
    ],                                                                         
    'activation_code' => 'required|integer|min:5',                             
    'operating_system' => 'required|alpha_num|max:45'                          
];

exists 方法中的第一个参数是表,第二个参数是我用于“mc”字段的自定义列名称。我通过了我想使用“use”关键字检查的第二列,然后在 where 子句中使用该字段。


3
投票

您可以使用Rule实现验证多列。

包括:

use Illuminate\Validation\Rule;

use Validator;

$AdminId = $request->AdminId;
$Validate = Validator::make($request->all(),[
        'TaxId' => [ 'required', Rule::exists('tax','id')                     
                                    ->where(function ($query) use ($AdminId) {                      
                                    $query->where('u_id', $AdminId);                  
                                    })], 
    ]);
if($Validate->fails())
        {`Your ERROR HERE`}
else
        {`SUCCESS`}

在我的示例中,我检查 u_id 和 Id,它们位于同一行和 2 列中。

解释:例如

我的数据库在税表中有 2 行

id = 1,u_id = 1,税费 =“GST”,值 -> 8

id = 2,u_id = 2,税费 =“GST”,值 -> 5

第一种情况,如果输入 id = 2 且 u_id = 1,则验证必须失败,因为该行属于 u_id = 2。

第二种情况,如果输入 id = 2 且 u_id = 2 验证必须成功


1
投票

我用最简单的方法解决了这个问题

  • 对于
    numero_de_somme

'numero_de_somme' => 'unique:personnels,numero_de_somme|exists:fonctionnaire,num_somme,cin,'.Request::get('cin'),

  • 对于
    cin

'cin' => 'unique:personnels,cin|exists:fonctionnaire,cin',

PS。别忘了打电话

use Illuminate\Http\Request;


0
投票

这里有一种使用

Rule
类来实现的方法。从技术上讲,两次使用
exist
规则是多余的。

两个

exists
规则检查完全相同的事情,然后对数据库执行相同的查询。

use Illuminate\Validation\Rule;

public function rules()
{
    $data = $this->validationData();

    $cin = $this->has('cin')
        ? $data['cin']
        : null;

    $num_somme = $this->has('numero_de_somme')
        ? $data['numero_de_somme']
        : null;

    return [
        'numero_de_somme' => [
            Rule::unique('personnels', 'numero_de_somme'),
            Rule::exists('fonctionnaire', 'num_somme')->where('cin', $cin),
        ],
        'cin' => [
            Rule::unique('personnels', 'cin'),
            Rule::exists('fonctionnaire', 'cin')->where('num_somme', $num_somme),
        ],
    ];
}

-1
投票
   if (is_numeric($request->get('emailOrphone'))){
  $request->validate([
      'emailOrphone'=>'exists:users,phone',
  ],
  [
      'emailOrphone.exists'=>'phone is invalid.'
  ]);
 }else{
     $request->validate([
         'emailOrphone'=>'exists:users,email',
     ],
         [
             'emailOrphone.exists'=>'email is invalid.''
         ]);
 }
© www.soinside.com 2019 - 2024. All rights reserved.