这是我的第一个问题,所以请放轻松。我使用 Laravel 一段时间了;然而,最近我在测试客户端应用程序时遇到了一个问题。
问题是,如果用户双重提交或简单地单击提交按钮 x 次,那么相同的记录将在数据库中创建 x 次。
我以前从未遇到过这个问题,因为简单的唯一验证就可以实现这一点。
然而,这种形式(或确切的模型)允许具有相同值/重复项的数据(客户端应用程序要求)。
所以我做的第一件事如下:
public function store(CustomRequest $request)
{
if($lastEntry = Record::latest()->first()){
if(
($request->name == $lastEntry->name)
&& ($request->another == $lastEntry->another)
// && ($request->user()->id == $lastEntry->user_id) // Current user check (need to modify the $lastEntry for it to work efficiently!)
&& (now()->diffInMinutes($lastEntry->created_at) < 5) // I added this later as another way to allow duplicates records after each other if they were created 5m apart
){
return redirect()
->route('show.record', $lastEntry->id)
->with('success', 'Record has been created successfully.');
}
}
$record= new Record();
....
}
现在,经过测试,效果很好。但是,我的问题是,是否有任何内置解决方案、软件包或更好的解决方案?
另外,我应该做一个会话解决方案以获得更快的响应 - 因为,如果我错了,请纠正我,但如果它位于具有 > 500k 记录的表上,这不会很慢吗?
编辑:我考虑过为此制作一个自定义节流中间件,但这会是一个坏主意,你觉得怎么样?
另外,正如 @nice_dev 提到的,用户越多,就会出现双重情况,所以我考虑在记录表中添加 user_id 字段并获取当前用户创建的最后一条记录,但我仍然认为这是一个糟糕的解决方案。
不幸的是,Javascript 解决方案不会解决这个问题
编辑:我所说的 Javascript 解决方案的意思是,一旦单击按钮,就会禁用它类型的解决方案(任何客户端解决方案)。
顺便说一句,客户端应用程序最终每个表将拥有超过 500k 条记录(至少在第一年左右)。
请随意修改我的问题......就像我说我是新来的!
繁华开满天机