Ich habe Probleme mit meiner Paginierung ... Ich habe zwei Tabellen mit Daten aus einer Datenbank und ich habe sie mit Laravel Paginator paginiert.
Nun ist mein Problem, wenn Sie beispielsweise auf Seite 2 gehen, wird? Page = 2 hinzugefügt. Dadurch wird jedoch die erste Tabelle auch auf Seite 2 angezeigt.
Gibt es überhaupt sowas zu bekommen?
page_table1={number}&page_table2={number}
so wenden Sie den Seitenwechsel nicht auf andere Tabellen an.
Leider kann ich diesen Code momentan nicht testen, aber beim Durchsuchen der Dokumente und des Codes (in Illuminate/Pagination/Environment
) könnte ich Ihnen Folgendes vorstellen:
# use default 'page' for this
$collection1 = Model::paginate(20);
# use custom 'other_page' for this
$collection2 = Model2::paginate(20);
$collection2->setPageName('other_page');
Die setPageName()
-Methode ist nicht in den Dokumenten dokumentiert, aber es handelt sich um eine öffentliche Methode neben der in der Dokumentation angegebenen. Daher sollte sie einwandfrei funktionieren. Zur Referenz ist dies die Deklaration (l. 171-180 in 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;
}
Berücksichtigen Sie nun, dass an die URL eine weitere Abfragezeichenfolge angehängt wird. Sie müssen der Paginierung dann mitteilen, dass sie berücksichtigt werden soll. Verwenden Sie die Methode appends()
:
$collection1->appends(array_except(Request::query(), 'page'))->links();
$collection2->appends(array_except(Request::query(), 'other_page'))->links();
Geben Sie also jedem Presenter an, die URL mit allen Abfragezeichenfolgen aufzubauen (das Array, das sich aus Request::query()
ohne dem aktuellen Index des Paginators ergibt, oder Sie erhalten einen doppelten Wert). array_except()
ist ein eingebauter Array-Helfer Laravel, der das angegebene Array (1. Parameter) zurückgibt und den übergebenen Index (2. Parameter) löscht.
Ich werde versuchen, diesen Code so bald wie möglich zu testen, aber es sollte funktionieren. Lass es mich auf jeden Fall wissen!
$publishedArticles = Article::paginate(10, ['*'], 'published');
$unpublishedArticles = Article::paginate(10, ['*'], 'unpublished');
Das dritte Argument wird wie folgt verwendet:
laravel/public/articles? Published = 3
laravel/public/articles? unveröffentlicht = 1
Dies ist eine einfache Lösung, die ich in Laravel 4 gefunden habe.
Controller
Ändern Sie den Seitennamen, bevor Sie den Paginator erstellen:
Paginator::setPageName('page_a');
$collection_A = ModelA::paginate(10);
Paginator::setPageName('page_b');
$collection_B = ModelB::paginate(10);
Aussicht
Machen Sie dasselbe: Ändern Sie den Seitennamen, bevor Sie die Links drucken
Paginator::setPageName('page_a');
$collection_A->links();
Paginator::setPageName('page_b');
$collection_B->links();
Wenn Sie während der Navigation zu einer anderen Seite keinen Seitenstatus verlieren möchten, hängen Sie die aktuelle Seite aus allen Sammlungen an die Links an:
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();
in Laravel 5.3 (Maibe, das in einer anderen Laravel 5-Version arbeitet) verwende ich Folgendes:
$produk = Produk::paginate(5, ['*'], 'produk');
$region = Region::paginate(5, ['*'], 'region');
und in Blade-Templates fügen Sie die Links anderer Ströme hinzu, um die Position zu erhalten:
{{$produk->appends(['region' => $region->currentPage()])->links()}}
{{$region->appends(['produk' => $produk->currentPage()])->links()}}
Geben Sie in Laravel 5.2 den Seitennamen an, wenn Sie paginate()
verwenden.
Hier ist ein Beispiel, das mit mehreren Paginatoren auf einer Seite arbeitet.
$pageName
anzugeben.Siehe die Methode \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);
}
Hinweis: $pageName = 'p'
Laravel 5.7
Model->paginate(10, ['*'], 'paramName');
10 = Max items per page
['*'] = colums
paramName = pagination param name
Illuminate\Database\Eloquent\Builder
Benutzen:
$var1 = DB1::orderBy('...')->paginate(5, ['*'], '1pagination');
$var2 = DB2::orderBy('...')->paginate(5, ['*'], '2pagination');
Für Laravel 5.2
Die Antwort von anonym kann erweitert werden, um in Ansichten mit verwandten Modellen sehr praktisch zu sein. getestet in laravel-5.4:
Angenommen, wir haben eine Sicht für den CustomerController show.blade.php
und übergeben das Modell Customer
mit:
`` `
return view(['customer' => \App\Customer::find($customerId)]);
Jeder Kunde hat viele Produkte und viele Standorte. Wir möchten eine Liste mit Seiten und Artikeln für seine/ihre Produkte und Standorte.
@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() !!}
Klingt für mich so, als müssten Sie das Paging-Tool aktualisieren, damit es über einen zusätzlichen Parameter verfügt, der die Tabelle identifiziert, da es nicht intelligent genug ist, um zu wissen, dass es möglicherweise zwei Instanzen auf derselben Seite hat. DOH!
Anstatt die aktuelle Seite für alle Tabellen über eine URL festlegen zu müssen, sollten Sie die aktive Seitennummer idealerweise in der Sitzung anhand der Tabellen-ID speichern. DANN muss sich Ihr Skript nur mit Anweisungen befassen und nicht sicherstellen, dass vorhandene Seitennummern vorhanden sind ebenfalls.
Hier ist ein wirklich Entwurfsentwurf ....
// The page would be $tableId + "," + $pageNum
// Passed as a value of "page"
$goTo = "$tableId,$pageNum";
?page=$goTo
Wenn es dann zu dem Teil kommt, der Ihre Tabellendaten abruft, würde es etwas tun
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
}