去年,我创建了一个带有 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。
我的应用检查了可用的地点,日期和时间,并且不允许用户选择任何不可用的事件,但是无论我告诉他们多少次,总会有人使用浏览器后退按钮并保存事件再次:(
任何帮助将不胜感激。谢谢!
答案 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';
}