簡體   English   中英

Laravel 一頁多分頁

[英]Laravel Multiple Pagination in one page

我的分頁有問題。 我有兩個表,其中包含來自數據庫的數據,我使用 laravel Paginator 對其進行了分頁。

現在我的問題是,例如,當您將 go 添加到第 2 頁時,它會添加?page=2,但這也會使第一個表 go 也轉到第 2 頁。

有沒有辦法得到這樣的東西?

page_table1={number}&page_table2={number}

因此您不會在其他表上應用頁面更改。

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

第三個參數的用法如下:

laravel / public / articles?published = 3

laravel / public / articles?unpublished = 1

這是我在Laravel 4上找到的簡單解決方案。

控制者

在創建分頁器之前,請更改頁面名稱:

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

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

視圖

相同:在打印鏈接之前更改頁面名稱

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

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

如果您不想在導航到另一個頁面時丟失任何頁面狀態,請將所有集合中當前頁面附加到鏈接:

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

不幸的是,我現在無法測試此代碼,但是瀏覽文檔和代碼(在Illuminate/Pagination/Environment ),我想您可能是這樣的:

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

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

setPageName()方法未在文檔中進行記錄,但是它是與文檔中指示的方法一起使用的公共方法,因此應該可以正常工作。 供參考,這是聲明(l。171-180在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;
}

現在考慮到您將在URL后面附加另一個查詢字符串,因此您需要告訴分頁進行考慮。 使用appends()方法:

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

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

也就是說,告訴每個Presenter使用所有查詢字符串(由Request::query()生成的數組, 但不使用分頁器使用的當前索引,來構建url Request::query() ,否則將得到一個double值)。 array_except()是Laravel內置的數組助手,它返回給定的數組(第一個參數),該數組清除了傳遞的索引(第二個參數)。

我將嘗試盡快測試此代碼,但它應該可以工作。 無論如何都要讓我知道!

在laravel 5.3中(maibe在其他laravel 5版本中工作),我這樣使用:

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

並在刀片模板中附加鏈接其他電流以保持位置:

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

Laravel 5.7

Model->paginate(10, ['*'], 'paramName');

10 = Max items per page

['*'] = colums

paramName = pagination param name

照亮\\數據庫\\口才\\生成器

在Laravel 5.2中,使用paginate()時聲明頁面名稱。

這是一個可在頁面上使用多個分頁器的示例。

  • 確保為其他模型指定其他$pageName

參見方法\\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);
}

注意: $pageName = 'p'

使用:

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

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

對於Laravel 5.2

在具有相關模型的視圖中, 匿名答案可以擴展為非常方便。 測試

假設我們有一個CustomerController show.blade.php視圖,並使用以下方法將Customer模型傳遞給它:

```

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

每個客戶有很多產品,並且有很多位置,我們想要分頁列出他/她的產品和位置,簡單來說,我們可以在以下視圖中這樣做:

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

這已經晚了,但它適用於 laravel 7.x

$messages = Message::where('status', 0)
    ->paginate(10, ['*'], 'p')
    ->appends(Arr::except(Request::query(), 'p'));

在你看來,例如(inbox.blade.php)

{{$messages->links()}}

在我看來,您需要更新頁面調度工具,以便它有一個額外的參數來標識該表,因為它不夠聰明,無法知道它在同一頁面上可能有2個實例。

理想情況下,您希望通過表ID THEN將活動頁號存儲在會話中,而不必通過URL為所有表設置當前頁,您的腳本只需要擔心指令,而不必擔心確保其攜帶現有的頁碼。也。

這是一個真正的草案概念。

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

然后,當到達要獲取表數據的部分時,它將執行以下操作

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
}

工作在 Laravel 8, paginate需要 4 個參數:

片段:( API 文檔Github

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

為每個 model 修改第三個參數$pageName ,並附加除該分頁器的$pageName之外的所有查詢參數應該有效:

FirstModel::query()
    ->paginate(null, ['*'], 'first_model')
    ->appends(request()->except('first_model'));

SecondModel::query()
    ->paginate(null, ['*'], 'second_model')
    ->appends(request()->except('second_model'));

請注意,在這里使用->appends(...)可確保該分頁器的所有分頁鏈接都將保留當前查詢參數值。

例如,如果您在 url ?first_model=2&second_model=3上,則first_model分頁器的鏈接將類似於:

  • 上一個: ?first_model=1&second_model=3
  • 下一步: ?first_model=3&second_model=3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM