Проверка для трех уникальных полей и программных удалений - PullRequest
0 голосов
/ 22 марта 2019

В прошлом году я создал сайт laravel с таблицей events , где мне нужно было три поля, чтобы быть уникальными для любого события (место, дата и время).Я не смог настроить запрос на проверку, чтобы сделать это, поэтому я добавил уникальный индекс для этих трех полей напрямую через phpmyadmin и перехватил исключение, которое может произойти, если было вставлено дублированное событие.

Итак, мой метод store () имеет try/catch вот так:

try {

    $event = new Event;
    $event->place = $request->input('place');
    $event->date = $request->input('date');
    $event->time = $request->input('time');
    $event->save();

    return view(...);
} catch (\Illuminate\Database\QueryException $e) {

    // Exception if place-date-time is duplicated
    if($e->getCode() === '23000') {
        return view('event.create')
                ->withErrors("Selected date and time is not available");
    }
}

Что ж, теперь мне пришлось изменить приложение, чтобы можно было мягко удалять события, и япросто добавил поле «selected_at» к уникальному индексу, думая, что это будет так просто ... Этот подход больше не работает, поэтому я кое-где читал об этой проблеме, и единственное, что я получаю, это то, что я должен сделатьэто через запрос проверки с уникальным, но, честно говоря, я просто не получаю синтаксис для этого правила проверки с тремя полями, которые не могут быть равны, в то время как четвертое, delete_at, имеет значение null.

Мое приложение проверяетдля доступных мест, дат и времени и не позволяет пользователю выбрать любое недоступное событие, но независимо от того, сколько раз я говорил им, что всегда есть кто-токто использует кнопку назад браузера и снова сохраняет событие: (

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Это не очень хороший подход для решения проблемы. Вы можете выполнить следующие действия, чтобы решить эту проблему

  • Перед вставкой в ​​базу данных получить конкретную строку, если она существует из базы данных и сохранить в переменную.

  • Затем убедитесь, что данные уже сохранены в базе данных или нет.

  • Если данные уже есть, создайте пользовательское сообщение проверки с помощью Message Bag, как показано ниже.
$ifExist = $event
            ->wherePlace(request->input('place'))
            ->whereDate(request->input('date'))
            ->whereTime(request->input('time'))
            ->exist();

if ($ifExist) return 'already exist';

Это может помочь вам.

1 голос
/ 22 марта 2019

@ narayanshama91 указали правильный путь.

Вы сказали, что хотите использовать правило unique для проверки ввода, но проблема в том, что на прошлой неделе в Laravel Blog было предупреждение о возможных SQL Injection сообщениях пользователей.через уникальное правило, если ввод предоставлен пользователем.

Я бы настоятельно рекомендовал вам НЕ ИСПОЛЬЗОВАТЬ это правило в этом случае, так как вы зависите от пользовательского ввода.

В вашем случае правильным подходом будет ответ @ narayanshama91.

$ifExist = $event
    ->wherePlace(request->input('place'))
    ->whereDate(request->input('date'))
    ->whereTime(request->input('time'))
    ->exist();
    if ($ifExist) {
       return 'already exist';
    }
...