34

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

したがって、検証ルールを使用して、次のことを確認できるようにしたいと考えています。

  • game_idgamesテーブル (idフィールド)内に存在する
  • team1_idteamsテーブル (idフィールド)内に存在し、game_id列 (テーブル内) は入力teamsの値と等しくなければなりません。game_id
  • 上記のようにteam2_id

したがって、私のフォームで1forを入力した場合、チーム テーブル内のレコードが両方のとの値を持ってgame_idいることを確認できるようにしたいと考えています。team1_idteam2_id1game_id

これが理にかなっていることを願っています。

ありがとう

4

7 に答える 7

40

Laravel 5.3+ から、カスタムの where 句をexists および unique rulesに追加できます。

これが私のシナリオです。電子メール検証テーブルがあり、渡されたマシン コードとアクティベーション コードが同じ行に存在することを確認したいと考えています。

必ず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 メソッドの最初の引数はテーブルで、2 番目の引数は「mc」フィールドに使用しているカスタム列名です。チェックする 2 番目の列を where 句に渡します。

カスタム検証ルールが不要になったため、これは非常に便利です。

于 2017-06-15T18:06:42.297 に答える
25

カスタム検証ルールが必要な場合は、このために別のクラスを作成します。ただし、簡潔にするために、インライン クロージャを使用した場合とほとんど同じです。

// 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'
);
于 2014-09-30T13:45:28.313 に答える
2

別の方法でこれらを試すことができますか

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
);
于 2021-02-17T10:47:36.420 に答える