我的分页遇到了一些麻烦。 我有两个表来自数据库中的数据,我用laravel Paginator对它进行了分页。
现在我的问题是,当你去,例如,第2页它添加?page = 2但这使第一个表也转到第2页。
有没有得到这样的东西?
page_table1={number}&page_table2={number}
所以你不要在其他表上应用页面更改。
答案 0 :(得分:35)
$publishedArticles = Article::paginate(10, ['*'], 'published');
$unpublishedArticles = Article::paginate(10, ['*'], 'unpublished');
第三个参数使用如下:
laravel /公共/物品?出版= 3
laravel /公共/物品?未公布= 1
答案 1 :(得分:26)
这是我在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();
答案 2 :(得分:20)
很遗憾,我现在无法测试此代码,但浏览文档和代码(在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()
方法未在文档中记录,但它与文档中指出的方法一起是公共方法,因此它应该可以正常工作。对于参考,这是声明(vendor/laravel/framework/src/Illuminate/Pagination/Environment.php
中的l.171-180):
/**
* 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使用所有查询字符串构建url(由Request::query()
生成的数组,而不是分页器使用的当前索引,或者您是&#39;最终会得到一个双倍值)。 array_except()
是一个内置于数组助手中的Laravel,它返回已传递索引(第二个参数)的给定数组(第一个参数)。
我会尽快尝试测试此代码,但它应该可以正常运行。无论如何,让我知道!
答案 3 :(得分:10)
在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()}}
答案 4 :(得分:5)
在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'
答案 5 :(得分:4)
Laravel 5.7
Model->paginate(10, ['*'], 'paramName');
10 = Max items per page
['*'] = colums
paramName = pagination param name
Illuminate \ Database \ Eloquent \ Builder
答案 6 :(得分:1)
使用:
$var1 = DB1::orderBy('...')->paginate(5, ['*'], '1pagination');
$var2 = DB2::orderBy('...')->paginate(5, ['*'], '2pagination');
对于Laravel 5.2
答案 7 :(得分:1)
anonym的答案可以扩展为在具有相关模型的视图中非常方便。 在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() !!}
答案 8 :(得分:1)
这很晚,但是可以与laravel 7.x一起使用
$messages = Message::where('status', 0)
->paginate(10, ['*'], 'p')
->appends(Arr::except(Request::query(), 'p'));
您认为示例(inbox.blade.php)
{{$messages->links()}}
答案 9 :(得分:0)
听起来像你需要更新分页工具,以便它有一个额外的参数来识别表,因为它不够聪明,知道它可能在同一页面上有2个自身实例.DOH!
不是必须通过URL为所有表设置当前页面,理想情况下,您希望按表ID THEN在会话中存储活动页码,您的脚本只需要担心指令而不必担心确保它携带现有的页码也是。
这是一个真正的草案概念......
// 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
}
答案 10 :(得分:0)
在 Laravel 8 中工作,paginate
需要 4 个参数:
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
修改每个模型的第三个参数 $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