Как создать пользовательское правило проверки для 4 совместно уникальных столбцов - PullRequest
0 голосов
/ 30 апреля 2018

Поскольку по умолчанию Laravel unique:tablename правило проверки допускает только два столбца; в тех случаях, когда более двух столбцов являются уникальными, он напрямую выбрасывает QueryException с кодом ошибки SQLSTATE 23000 . В качестве временного решения я перехватываю исключение и выдаю предупреждение:

try{
    //My query that might throw an exception for a duplicate entry
} catch (\Exception $e){
    return $e->getCode() == 23000 ?
           redirect()->back()->with('warning','Duplicate entry') :
           redirect()->back()->with('error','Unknown Error Occurred');
}

Проблема в том, что для всех остальных сценариев, где код ошибки не равен 23000, я буду видеть только сообщение об ошибке Unknown Error Occurred вместо Whoops . Очевидно, что отладка станет кошмаром.

Поэтому я искал альтернативы. Мне пришлось выбрать один из двух вариантов: а) Использовать сторонний пакет или, б) Создать Настраиваемое правило проверки

Я выбрал вариант б. Но я борюсь с тем, как я могу создать его сам. Когда я посмотрел на пример (для одноразового встроенного правила):

$validator = Validator::make($request->all(), [
    'title' => [
       'required',
       'max:255',
        function($attribute, $value, $fail) {
            if ($value === 'foo') {
                return $fail($attribute.' is invalid.');
            }
        },
    ],
]);

... Я понял, что правило может быть применено только к одному атрибуту и ​​значению. Но у меня есть 4 атрибута и значения, чтобы проверить, действительно ли они уникальны. Как я могу это сделать?

1 Ответ

0 голосов
/ 30 апреля 2018

Я использую вот так,

public function store(Request $req)
{
    $column1 = $req->input('column1');
    $column2 = $req->input('column2');
    $column3 = $req->input('column3');
    $column4 = $req->input('column4');


    $whereData = [
        ['column1', $column1],
        ['column2', $column2],
        ['column3', $column3],
        ['column4', $column4]
    ];

    $count = DB::table('yourtablename')->where($whereData)
                                ->count();

    if($count > 0){
        // The combined is not unique
        //send error message
    }else{
        //do whatever u need
    }

}

Вы можете реализовать это и в методе загрузки AppServiceProvider.

Добавьте этот код к вашему способу загрузки:

Validator::extend('uniqueofFourColumns', function ($attribute, $value, $parameters, $validator) {

    $whereData = [
        ['column1', $value],
        ['column2', $parameters[0]],
        ['column3', $parameters[1]],
        ['column4', $parameters[2]]
    ];

    $count = DB::table('yourtablename')->where($whereData)->count();

    return $count === 0;
});

Тогда вы можете использовать uniqueofFourColumns это правило везде, где вам нужно:

'column1' => 'uniqueofFourColumns:'.{{$request->column2}}.', '.{{$request->column3}}.', '.{{$request->column4}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...