Правило валидации для laravel - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть таблица GateAccess: id, person_id, gate_id, time_id. При добавлении новой записи в эту таблицу я бы хотел запретить добавление нескольких записей с одинаковым gate_id для одного person_id. Gate_id должен быть уникальным для конкретного person_id.

Я хотел бы иметь такую ​​таблицу:

id, person_id, gate_id, time_id
1, 2, 1, 1
2, 2, 2, 2

, но не одну:

id, person_id, gate_id, time_id
1, 2, 1, 1
2, 2, 1, 2

У меня есть валидатор:

 $validator = Validator::make($data, [
            'first_name' => 'required',
        ], $messages);

Можете ли вы помочь мне составить правило для этого валидатора?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вам необходимо указать, когда применяются уникальные правила проверки. С laravel валидатором вот так:

[
  'some_field'=>'unique:table,field,NULL,id,criteria,compare'
]

Это правило гласит, что "some_field" будет уникальным, когда "критерии" равны "сравнить"

Для вашего примера это так

$person_id = Request::get('person_id');
$gate_id = Request::get('gate_id');  

[
    'person_id' => 'unique:GateAccess,person_id,NULL,id,gate_id,' . $gate_id;
    'gate_id' => 'unique:GateAccess,gate_id,NULL,id,person_id,' . $person_id;
];

Таким образом, person_id будет уникальным, когда gate_id равен $ gate_id и таким же образом для gate_id

1 голос
/ 25 февраля 2020

вы можете использовать validator rule для достижения того, что вы хотите, поэтому в вашем случае ваша проверка должна выглядеть следующим образом.

Validator::make($data, [
      'gate_id' => [
          'required',
          Rule::unique('GateAccess')->where(function ($query) use($data){
               $query->where('person_id', $data->person_id);
          })->ignore($request->id),
      ],
])->validate();

Это установит gate_id как уникальный, где идентификатор человека в вашей записи равен идентификатору человека, которого вы передали.

не забудьте добавить это выше в свой код

use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
...