Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny]Laravel, pobieranie danych z 3 tabel paginacja
Forum PHP.pl > Forum > PHP > Frameworki
LarCal
Witam,

Pobieram dane z 3 tabel, różnią się kolumnami (kolumna created_at jest w każdej), aktualnie pobieram każdą z tabel i za pomocą ->map() dodaje fake kolumne (nie obejde tego, musze ją dodawać), sortuje za pomocą usort(według created_at) i łącze te 3 tabele za pomocą merge_array a następnie robię paginacje. Problem jest taki, że mimo paginacji zawsze pobierają się wszystkie rekordy. Ta paginacja nie działa tak jak zwykłe ->paginate() na obiekcie (taka fake paginacje bez limit). Ogólnie łącze te tabele i potem wyświetlam rekordy z tych tabel wedlug created_by. Jak mogę za pomocą sqla lub orm zrobić aby paginacja działała w normalny sposób i było to optymalne? Dodam, ze union próbowałem ale problem z różnicą kolumn. Prosze o pomoc.

  1. public function getTestData()
  2. {
  3. $test1 = Test1::select(['updated_at', 'accrual_amount'])
  4. ->where('user_id', Auth::id())
  5. ->get();
  6.  
  7. $test1->map(function ($a) {
  8. $a['type'] = 'test1';
  9. });
  10.  
  11. $test2 = Test2::select(['updated_at', 'amount_currency', 'currency'])
  12. ->where('user_id', Auth::id())
  13. ->get();
  14.  
  15. $test2->map(function ($a) {
  16. $a['type'] = 'test2';
  17. });
  18.  
  19. $test3 = Test3::select(['updated_at', 'accrual_amount'])
  20. ->where('user_id', Auth::id())
  21. ->get();
  22.  
  23. $test3->map(function ($a) {
  24. $a['type'] = 'test3';
  25. });
  26.  
  27. $abc = array_merge($test1->toArray(), $test2->toArray(), $test3->toArray());
  28.  
  29. usort($abc, function ($a, $b) {
  30. return strcmp($b['updated_at'], $a['updated_at']);
  31. });
  32.  
  33. $paginator = new ArrayPaginator(request());
  34. return $paginator->paginate($abc, 10, '/url');
  35. }
r4xz
Najpierw dopełnij do takiej samej liczby kolumn i dodaj odrazu w sql typ:

  1. $test1 = Test1::select(['updated_at', 'accrual_amount', DB::raw('null as amount_currency'), DB::raw('null as currency'), DB::raw('"test1" as type')])
  2. ->where('user_id', Auth::id());


Potem zrób union i paginate:

  1. $test2 = ...
  2. $test3 = Test3::...->union($test1)->union($test2)->paginate();


Jeszcze tylko sortowanie po złączenniu (między union, a paginate) oraz sprawdzenie czy moje rozwiązanie pisane z palca nie ma błędów i masz gotowe rozwiązanie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.