Piszę tu ponieważ nie chciałem zakładać nowego podobnego tematu.
Drugi dzień próbuję zrobić kolejkę budowy w mojej grze. Próbowałem już "na żywo" obliczać czas startu i końca budowy, ale skończyło się milionem warunków w pętli, które w działały dopóki ktoś nie zaczął kombinować, np anulować kilka zadań budowy na raz, szybko dodawać kolejne itp. W tej chwili czas startu i zakończenia przechowuje w bazie. Teoretycznie łatwiej jest tym zarządzać, ale mam problem z szybkim klikaniem w przycisk wybuduj. Poniżej zamieściłem przykładowy, najprostszy kod, który mi nie działa.
Zmienna $temp przechowuje ostatni dodany wpis do kolejki. Jeśli taki nie istnieje ustawia czas startu nowego na teraz, jeśli istnieje to czas startu nowego równa się czas zakończenia poprzedniego. Problem w tym, że przy szybkim kliknięciu warunek jest sprawdzany jeszcze przed dodaniem nowego wpisu z poprzedniego kliknięcia. Efekt jest taki, że kilka elementów z listy ma identyczny czas startu. Próbowałem to zabezpieczyć regenerując csrf_token przy każdym przesłaniu lub tworząc swoją zmienną sesyjną, lecz przy bardzo szybkim kliknięciu i tak dodadzą się 2-3 takie same elementy. Oczywiście nie chcę tego zabezpieczać tylko po stronie przeglądarki.
public function postBuild(Requests\MyRequest $request)
{
$temp = $this->item->build_queue()->last()->first();
if ($temp) {
$start_at = $temp->end_at->timestamp;
} else {
$start_at = Carbon::now()->timestamp;
}
$slug = $request->slug;
$duration = 50;
BuildQueue::create([
'item_id' => $this->item->id,
'building_slug' => $slug,
'start_at' => $start_at,
'end_at' => $start_at + $duration,
]);
return redirect()->back();
}
Już w kilku przypadkach miałem problem z tym, że przy szybkim odświeżaniu strony lub szybkim klikaniu w przycisk coś co powinno wydarzyć się raz, dzieje się kilka razy. Może Laravel ma jakis sposób na rozwiązanie tego problemu. Bardzo proszę o pomoc.
//edit
Sprawdziłem też w innym projekcie i problem jest ten sam. Jeszcze prościej:
$a = Comment::where('post_id', $request->post_id)->where('author_name', $request->author_name)->first();
if(!$a) {
Comment::create($request->all());
}
Gdy dodaje komentarz z tym samym autorem powoli wszystko działa, gdy kliknę szybko parę razy to dodaje się wiele wpisów. Oczywiście takie coś można rozwiązać poprzez unique w bazie danych, ale mnie interesuje pierwszy przykład gdzie to jest niemożliwe.