[英]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
在具有相關模型的視圖中, 匿名答案可以擴展為非常方便。 在laravel-5.4中測試 :
假設我們有一個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 個參數:
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.