Laravel Multiple Pagination在一页中

时间:2014-06-06 16:08:31

标签: php laravel pagination

我的分页遇到了一些麻烦。 我有两个表来自数据库中的数据,我用laravel Paginator对它进行了分页。

现在我的问题是,当你去,例如,第2页它添加?page = 2但这使第一个表也转到第2页。

有没有得到这样的东西?

page_table1={number}&page_table2={number}

所以你不要在其他表上应用页面更改。

11 个答案:

答案 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的答案可以扩展为在具有相关模型的视图中非常方便。 中进行了测试:

假设我们有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 个参数:

代码段:(API Docs, Github)

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