Laravel - 我的双重提交解决方案有效吗

这是我的第一个问题,所以请放轻松。我使用 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 条记录(至少在第一年左右)。


请随意修改我的问题......就像我说我是新来的!


潇潇雨雨
浏览 106回答 1
1回答

繁华开满天机

因为,我的情况有点独特,所以我采用了相同的解决方案,但在记录表(FK)上添加了 user_id 列。并检查同一用户在过去x分钟内是否创建了相同的记录(因为客户端想要重复的记录但不允许用户出错)。尽管如此,我还是添加了一段 JavaScript 代码来禁用该按钮,以防万一。客户需要一种后端解决方案,而不是客户端解决方案。但不妨补充一点,因为我有点解决了这个问题(有点)。
打开App,查看更多内容
随时随地看视频慕课网APP