Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny]Laravel, pobieranie danych z 3 tabel paginacja
LarCal
post 17.11.2017, 21:30:09
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.11.2017

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


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. }
Go to the top of the page
+Quote Post
r4xz
post 25.11.2017, 16:18:01
Post #2





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

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


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


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 15.06.2025 - 19:36