duanjing7651
duanjing7651
2017-12-28 17:56

在laravel中通过子查询进行分页

已采纳

The following code will output the 3 first webshops correctly:

public function category($slug) {
    $category = Category::select()
        ->where('slug', $slug)
        ->with(['webshops' => function ($query) {
            $query->groupBy('webshops.id')
                ->where('active', 1)
                ->orderBy('webshops.name')
                ->with(['brands' => function ($query) {
                    $query->where('active', 1)
                        ->where('replace_by', NULL)
                        ->orderBy('name');
                }])
                ->paginate(3);
        }])
        ->first();

    if(!$category)
        abort(404);

    $data['title'] = "Tøjbutikker der forhandler ". $category->name;

    $data['category'] = $category;
    $data['webshops'] = $category->webshops;
    return view('pages/category', $data);
}

Blade template:

                <ul class="webshop-list">
                    @foreach($webshops as $webshop)
                        <li>
                            {{ $webshop->name }}
                        </li>
                   @endforeach
                </ul>
                {{ $webshops->links() }}

But when I insert the pagination code in my blade template:

{{ $category->webshops->links() }}

I get the following error:

Method links does not exist.

I'm following the documentation from here: https://laravel.com/docs/5.4/pagination

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • dongyu3967 dongyu3967 4年前

    You can create paginator manually, but if you want to keep code maintainable, just use two collections:

    $category = Category::where('slug', $slug)->first();
    $shops = Webshop::whereHas('categories', function($q) use($category) {
                     $q->where('id', $category->id);
                 })
                 ->groupBy('id')
                 ->orderBy('name')
                 ->with(['brands' => function ($query) {
                     $query->where('active', 1)
                           ->where('replace_by', null)
                           ->orderBy('name');
                 }])
                 ->paginate(3);
    
    点赞 评论 复制链接分享
  • dpfl37651 dpfl37651 4年前

    make use of the simplePaginate function instead

    $category = Category::select()
    ->where('slug', $slug)
    ->with(['webshops' => function ($query) {
        $query->groupBy('webshops.id')
        ->orderBy('webshops.name')
        ->with(['brands' => function ($query) {
            $query->where('active', 1)
            ->where('replace_by', NULL)
            ->orderBy('name');
        }])
        ->simplePaginate(3);
    }])
    ->first();
    
    点赞 评论 复制链接分享
  • doubaolan2842 doubaolan2842 4年前

    Use

    {{ $category->links() }}
    

    $category should be your variable name which you're passing to blade.


    Example

    If you're passing data like this return view('viewName', ['names' => $names]); then you have to use {{ $names->links() }}


    Read this Laravel documentation

    点赞 评论 复制链接分享

相关推荐