验证三个唯一字段和软删除

时间:2019-03-22 10:09:56

标签: mysql laravel validation request unique

去年,我创建了一个带有 events 表的 laravel 网站,在该站点中,我需要三个字段对于任何事件(地点,日期和时间)都是唯一的。我无法设置验证请求来执行此操作,因此我直接通过 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");
    }
}

好吧,现在我不得不更改应用程序,以便可以软删除事件,我只是将'deleted_at'字段添加到唯一索引中,以为那太简单了...这种方法不再起作用了,所以我我一直在这里读过这个问题,我唯一得到的是我应该通过具有唯一性的验证请求来完成此操作,但是老实说,我只是没有获得带有三个字段的验证规则的语法等于,而第四个为delete_at,则为null。

我的应用检查了可用的地点,日期和时间,并且不允许用户选择任何不可用的事件,但是无论我告诉他们多少次,总会有人使用浏览器后退按钮并保存事件再次:(

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

这不是解决问题的好方法。 您可以按照以下步骤解决此问题

  • 在插入数据库之前,如果数据库中存在该行,则会获得特定的行 并存储到变量中

  • 然后检查数据是否已经存储到数据库中。

  • 如果数据已经存在,请使用下面的消息袋创建自定义验证消息。
$ifExist = $event
            ->wherePlace(request->input('place'))
            ->whereDate(request->input('date'))
            ->whereTime(request->input('time'))
            ->exist();

if ($ifExist) return 'already exist';

这可能会对您有所帮助。

答案 1 :(得分:1)

@ 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';
    }