Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inny][laravel 5.1] Dublowanie rekordów przy szybkim odświeżaniu strony
Looozak
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 2.04.2010
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Witam,

wydaje mi się, że moje pytanie jest banalnie proste, ale mój mózg już chyba dzisiaj przestał pracować, nawet nie wiem jak szukać rozwiązania. Praca inżynierska goni...

Mianowicie:
Sprawdzam czy istnieje rekord w bazie, jeżeli nie istnieje to tworzę nowy. Podczas przytrzymania F5 rekordów dodaje się kilka. Klucz unique w bazie nie wchodzi w grę.

  1. if (!Auth::user()->jakis_item()) {
  2. JakisItem::firstOrCreate([
  3. 'user_id' => Auth::user()->id
  4. ]);
  5. }


Dodam tylko, że User i JakisItem są połączone relacją One to Many, a metoda jakis_item() klasy User zwraca pojedynczy obiekt Eloquenta.

Chodzi mi o to żeby każdy użytkownik miał ZAWSZE minimum jeden JakisItem, który może, np zmienić właściciela i wtedy chcę utworzyć nowy. Kod powyżej wykonuje się po każdym odświeżeniu strony i sprawdza czy ten item nie zniknął (jest w konstruktorze kontrolera).

Podczas tworzenia użytkownika w metodzie postRegister klasy kontrolera AuthController tworzę rekord tak jak powyżej. Jeśli jest na to jakiś lepszy sposób bardzo proszę o nakierowanie na niego.

Pozdrawiam!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Looozak
post
Post #2





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 2.04.2010
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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.

  1. public function postBuild(Requests\MyRequest $request)
  2. {
  3. $temp = $this->item->build_queue()->last()->first();
  4.  
  5. if ($temp) {
  6. $start_at = $temp->end_at->timestamp;
  7. } else {
  8. $start_at = Carbon::now()->timestamp;
  9. }
  10.  
  11. $slug = $request->slug;
  12.  
  13. $duration = 50;
  14.  
  15. BuildQueue::create([
  16. 'item_id' => $this->item->id,
  17. 'building_slug' => $slug,
  18. 'start_at' => $start_at,
  19. 'end_at' => $start_at + $duration,
  20. ]);
  21.  
  22. return redirect()->back();
  23. }


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:

  1. $a = Comment::where('post_id', $request->post_id)->where('author_name', $request->author_name)->first();
  2.  
  3. if(!$a) {
  4. Comment::create($request->all());
  5. }


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.

Ten post edytował Looozak 28.11.2015, 14:59:06
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 15:33