blog
user
13 072023

Bywa czasami że zajdzie potrzeba aby pobrać dużą ilość danych z bazy danych aby wykonać niezbędne na nich operacje. Standardowo pobierając rekordy z użyciem Laravel Eloquent używamy kodu


$klienci = Klienci::where('aktywny,1)->get();

foreach($klienci as $klient){

  $klient->imie = 'Kowalski';

  $klient->update();

}

Przy małej ilości rekordów taki zapis jest jak najbardziej poprawny. W przypadku większej ilości danych osiągających już kilka tysięcy rekordów tak napisany skrypt może być niewydajny. Z pomocą przychodzi metoda chunk(). Metoda chunk pobiera podzbiór modeli Eloquent, przekazując je do zamknięcia w celu przetworzenia. Ponieważ w danym momencie pobierany jest tylko bieżący fragment modeli Eloquent, metoda chunk zapewnia znacznie mniejsze zużycie pamięci podczas pracy z dużą liczbą modeli. Poniższy przykład pobiera podzbiór modeli w paczce po 200 rekordów:

Klienci::where('aktywny',1)->chunk(200), function ($klienci) {
  foreach ($klienci as $klient) {
  // ...
  }
});

Należy pamiętać, że podczas iteracji nie można wykonywać operacji zapisu na pobranych modelach. W szczególności na kolumnach użytych do filtrowania wydobywanych rekordów. W przykładzie powyższym zapis


 $klienci->aktywny = 0;
 $klienci->update();


wewnątrz pętli foreach() spowoduje błedy pobierania rekordów. W takim przypadku należy użyć funkcji chunkById(). Metoda chunkById() będzie zawsze pobierać modele z kolumną id większą niż ostatni model w poprzednim chunk. Poniższy zapis wykonujący operację zapisu na kolumnie "aktywny" będzie jak najbardziej poprawny.

Klienci::where('aktywny',1)->chunkById(200), function ($klienci) {
   foreach ($klienci as $klient) {
      $klienci->aktywny = 0;
      $klienci->update();

   }
});


Wracając jednak do wydajności. Po przeprowadzeniu testu na próbie 60.000 rekodów czas wykonania skryptu był podobny jednak ilość zużytej pamięci różniła się kolosalnie. Pierwszy skrypt potrzebował na wykonanie operacji aż 200MB podczas gdy drugi zaledwie 29MB.





Nasze newsy

Śledź nasze aktualności.

blog
user
16 042024

Wiosenne pożądki na serwerze

Wiosenne uporządkowanie zasobów na serwerze.

blog
user
13 072023

Iteracja dużej ilości danych w Laravel Eloquent

Jak poprawnie iterować dużą ilość danych w Laravel Eloquent

blog
user
29 032023

Wtyczka do Octobercms blokująca ip

Nowa wtyczka do Octobercms zwiększająca bezpieczeństwo stron www.

logo

Masz pytania? Skontaktuj się