2014-06-06 15 views
25

Mam problem z paginacją. Mam dwie tabele z danymi z bazy danych i ja je w paginacji z Paginatorem laravel.Laravel Wielokrotna paginacja na jednej stronie

Teraz mój problem polega na tym, że na przykład strona 2 jest dodawana? Page = 2, ale powoduje to, że pierwsza tabela przechodzi również do strony 2.

Czy jest coś takiego, aby uzyskać coś takiego?

page_table1={number}&page_table2={number}

więc nie zastosować zmianę strony na innych stołach.

Odpowiedz

9

Niestety nie mogę przetestuj ten kod już teraz, ale przeglądając dokumenty i kod (w Illuminate/Pagination/Environment) domyślam się, że możesz coś takiego:

# use default 'page' for this 
$collection1 = Model::paginate(20); 

# use custom 'other_page' for this 
$collection2 = Model2::paginate(20); 
$collection2->setPageName('other_page'); 

Metoda setPageName() nie jest udokumentowana w dokumentach, ale jest to metoda publiczna obok metod wskazanych w dokumentacji, więc powinna działać poprawnie. Dla porównania, jest to deklaracja (l 171-180 w vendor/laravel/framework/src/Illuminate/Pagination/Environment.php.):

/** 
* Set the input page parameter name used by the paginator. 
* 
* @param string $pageName 
* @return void 
*/ 
public function setPageName($pageName) 
{ 
    $this->pageName = $pageName; 
} 

teraz wziąć pod uwagę, że będzie masz inny ciąg kwerendy dołączany do adresu URL, więc trzeba powiedzieć paginacji to rozważyć . Użyj metody appends():

$collection1->appends(array_except(Request::query(), 'page'))->links(); 

$collection2->appends(array_except(Request::query(), 'other_page'))->links(); 

to znaczy powiedzieć każdy Presenter zbudować url ze wszystkich ciągów zapytań (tablicę wynikającej z Request::query()bez bieżący wskaźnik używany przez paginator, czy będzie koniec z podwójną wartością). array_except() jest pomocnikiem wbudowanym w tablicę Laravel, który zwraca podaną tablicę (pierwszy parametr) usuniętą z przekazanego indeksu (drugi parametr).

Spróbuję przetestować ten kod tak szybko, jak tylko mogę, ale powinien zadziałać. Daj mi znać w każdym razie!

+0

Nie udało mi się uzyskać niczego działającego przy użyciu opisanej metody. Gdzie jesteś? – vlasits

+2

'$ collection2-> setPageName ('other_page');' >>> ** call_user_func_array() oczekuje, że parametr 1 będzie prawidłowym oddzwanianiem, klasa "Illuminate \ Support \ Collection" nie ma metody "setPageName" ** – daVe

+4

Jeśli chodzi o downwiot, zastanów się, czy ta odpowiedź może odnosić się do innej wersji Laravel od tej, z której korzystasz ** teraz ** i co działało ** wtedy ** może nie działać w nowszej wersji. Tylko mówię. –

0

Brzmi tak, jakby trzeba było zaktualizować narzędzie stronicowania tak, aby zawierał dodatkowy parametr, który identyfikuje tabelę, ponieważ nie jest wystarczająco inteligentny, aby wiedzieć, że może mieć 2 wystąpienia na tej samej stronie .. DOH!

Zamiast ustawić aktualną stronę dla wszystkich tabel za pomocą adresu URL, najlepiej zapisać aktywny numer strony w sesji według identyfikatora tabeli THEN, twój skrypt musi tylko martwić się o instrukcje i nie martwić się o to, aby go zapewnić przenosi również istniejące numery stron.

Oto naprawdę opracowania koncepcji ....

// The page would be $tableId + "," + $pageNum 
// Passed as a value of "page" 
$goTo = "$tableId,$pageNum"; 
?page=$goTo 

Potem, kiedy dojdzie do tej części, która jest coraz danych tabeli byłoby zrobić coś takiego

if(!empty($_GET["page"])){ 
    list($tableId,$pageNum) = explode(",",$_GET["page"]); 

    // Store table's active page number 
    $_SESSION["_tableBrowser"][$tableId] = $pageNum; 


    // Your table reader would then look at the session for the active page number 
    // and not what is in $_GET 
} 
26

To jest łatwe rozwiązanie, które znalazłem na Laravel 4.

Controller

Zmień nazwę strony przed dokonaniem paginator:

Paginator::setPageName('page_a'); 
$collection_A = ModelA::paginate(10); 

Paginator::setPageName('page_b'); 
$collection_B = ModelB::paginate(10); 

Zobacz

Zrób to samo: zmienić nazwę strony przed wydrukowaniem linki

Paginator::setPageName('page_a'); 
$collection_A->links(); 

Paginator::setPageName('page_b'); 
$collection_B->links(); 

Jeśli nie chcesz stracić żadnego państwa strony podczas nawigacji do innej strony, dołącz do linków bieżącej strony ze wszystkich kolekcji:

Paginator::setPageName('page_a'); 
$collection_A->appends('page_b', Input::get('page_b',1))->links(); 

Paginator::setPageName('page_b'); 
$collection_B->appends('page_a', Input::get('page_a',1))->links(); 
+0

Awesome, działa świetnie dzięki! –

+0

Świetne rozwiązanie, dzięki. – Amin

4

W laravel 5.2 zadeklarować nazwę strony podczas korzystania paginate().

Oto przykład, który działa z wieloma paginatorami na stronie.

  • Pamiętaj, aby podać inne $pageName dla innych modeli.

Zobacz metodę \Illuminate\Database\Eloquent\Builder::paginate()

/** 
* Get things by ownerId 
* 
* @param integer $ownerId The owner ID. 
* 
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator Returns a pagination instance. 
*/ 
public function getThings($ownerId) 
{ 
    $builder = \App\Models\Things::where('ownerId', '=', (integer) abs($ownerId)); 

    // dd([ 
    //  '__METHOD__' => __METHOD__, 
    //  '__FILE__' => __FILE__, 
    //  '__LINE__' => __LINE__, 
    //  '$ownerId' => $ownerId, 
    //  'sql' => $builder->toSql(), 
    //  '$builder' => $builder, 
    //  'paginate' => $builder->paginate($perPage = null, $columns = ['*'], $pageName = 'p', $page = null), 
    // ]); 

    return $builder->paginate($perPage = null, $columns = ['*'], $pageName = 'p', $page = null); 
} 

Uwaga: $pageName = 'p'

22
$publishedArticles = Article::paginate(10, ['*'], 'published'); 
$unpublishedArticles = Article::paginate(10, ['*'], 'unpublished'); 

Trzeci argument jest używany w następujący sposób:?

laravel/public/artykuły opublikowane = 3

laravel/public/teksty niepublikowane = 1

+1

To jest świetne rozwiązanie)) Dzięki temu działa dobrze !!! –

+0

Dzięki, działa świetnie dla Laravel 5.4, ale nadal musisz dołączyć inne strony, jeśli chcesz, aby działały w tym samym czasie. – sr9yar

+0

To jest rozwiązanie dla Laravel 5.4 –

1

Zastosowanie:

$var1 = DB1::orderBy('...')->paginate(5, ['*'], '1pagination'); 

$var2 = DB2::orderBy('...')->paginate(5, ['*'], '2pagination'); 

Dla laravel 5,2

+0

Powtórz odpowiedź. – anonym

4

w laravel 5,3 (maibe pracy w innych laravel 5 wersji), używam tak :

$produk = Produk::paginate(5, ['*'], 'produk'); 
    $region = Region::paginate(5, ['*'], 'region'); 

w szablonie ostrzy dołącza prądy innych, aby zachować pozycję :

{{$produk->appends(['region' => $region->currentPage()])->links()}}  
    {{$region->appends(['produk' => $produk->currentPage()])->links()}}  
0

Odpowiedź anonym może zostać przedłużony do być bardzo przydatny w widoki, które modele pokrewnych.testowane :

Załóżmy, że mamy widok na CustomerController show.blade.php i mijamy modelu Customer do niego przy użyciu:

`` `

return view(['customer' => \App\Customer::find($customerId)]); 

` `` Każdy Klient ma Wiele produktów i ma wiele Lokalizacja i chcemy listę z paginacją zarówno jego produktów i lokalizacji, po prostu możemy zrobić to w widoku, jak:

@foreach($customer->products()->paginate(10,['*'],'productsPage') as $product) 
HTML list 
@endforeach 
{!! $customer->products()->paginate(10,['*'],'productsPage')->links() !!} 

@foreach($customer->locations()->paginate(10,['*'],'locationsPage') as $location) 
HTML list 
@endforeach 
{!! $customer->locations()->paginate(10,['*'],'locationsPage')->links() !!} 
Powiązane problemy