it-swarm.com.de

Laravel Mehrere Seitenumbruch auf einer Seite

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.

31
Melvin Koopmans

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!

18
Damien Pirsy
$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

31
anonym

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();
26
daVe

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()}}    
9
mosleim

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.

  • Achten Sie darauf, für andere Modelle einen anderen $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

3
Rubens

Benutzen:

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

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

Für Laravel 5.2

1
LauroRafael

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() !!}
0
SaidbakR

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
}
0
Adam