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

3
以下代码将正确输出前3个网店:
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模板:

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

但是当我在我的blade模板中插入分页代码时:
{{ $category->webshops->links() }}

我遇到了以下错误:

Method links does not exist.

我遵循这里的文档: https://laravel.com/docs/5.4/pagination 该文档与it技术有关,它介绍了关于Laravel 5.4中分页的用法。
3个回答

3
您可以手动创建分页器,但是如果您想保持代码可维护性,只需使用两个集合即可:
$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);

谢谢,但是Category和Webshop之间的关系是通过一个关系表来实现的,那我应该用什么替换where('category_id', $category->id)呢? - Christoffer
@Christoffer 对于多对多关系,只需使用 whereHas 而不是 where。我已经更新了代码。 - Alexey Mezenin

0

使用

{{ $category->links() }}

$category 应该是你传递给 Blade 的变量名。


示例

如果您像这样传递数据 return view('viewName', ['names' => $names]);,那么您必须使用{{ $names->links() }}


阅读这个 Laravel 文档


已经尝试过了。 调用未定义的方法 Illuminate\Database\Query\Builder::links() (视图: /localhost/***/resources/views/pages/category.blade.php) - Christoffer
你没有在 Category 上调用 paginate,它在不同的查询中... $category 是一个单一模型,而不是集合或分页器... ->first() - lagbox
Abdulla:我现在添加了更多的代码。 lagbox:我只想要一个类别,但是可以通过相关的网店进行分页。 - Christoffer

0

请使用simplePaginate函数

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接