【问题标题】:Paginate through subquery in laravel通过 laravel 中的子查询进行分页
【发布时间】:2018-06-09 06:39:02
【问题描述】:

以下代码将正确输出前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);
}

刀片模板:

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

但是当我在刀片模板中插入分页代码时:

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

我收到以下错误:

Method links does not exist.

我正在关注此处的文档: https://laravel.com/docs/5.4/pagination

【问题讨论】:

    标签: php mysql laravel pagination laravel-5.4


    【解决方案1】:

    您可以创建paginator manually,但如果您想保持代码可维护性,只需使用两个集合:

    $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-&gt;id)应该换成什么呢?
    • @Christoffer 对于多对多只需使用whereHas 而不是where。我已经更新了代码。
    【解决方案2】:

    改用 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();
    

    【讨论】:

      【解决方案3】:

      使用

      {{ $category->links() }}
      

      $category 应该是您传递给刀片的变量名。


      示例

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


      Read this Laravel documentation

      【讨论】:

      • 已经试过了。 Call to undefined method Illuminate\Database\Query\Builder::links() (View: /localhost/***/resources/views/pages/category.blade.php)
      • 您没有在 Category 上调用 paginate,它在不同的查询中调用 ...$category 是单个模型,而不是集合或分页器。 ...-&gt;first()
      • Abdulla:我现在添加了更多代码。 lagbox:我只想要一个类别,但通过相关的网上商店分页。
      猜你喜欢
      • 1970-01-01
      • 2015-09-23
      • 2013-08-01
      • 2012-10-02
      • 2016-05-11
      • 2014-08-19
      • 2020-02-05
      • 2017-06-13
      • 2017-09-28
      相关资源
      最近更新 更多