【问题标题】:Laravel 5, pagination and ordering a list by a relationship countLaravel 5,分页和按关系计数排序列表
【发布时间】:2015-06-10 02:02:08
【问题描述】:

我正在尝试按链接表计数对查询进行排序,但无法弄清楚如何使用 Laravel 分页;下面是我传递给视图的查询

我认为 Laravel 5 的分页器方法已被移动?

    $companies = Company::with('locations')->get()->sortBy(function($count)
    {
        return $count->locations->where('status', '=', 'Active')->count();
    }, null, true);

由于调用了 get 和 sortby 函数,我无法应用分页(以下错误)

调用未定义的方法 Illuminate\Database\Eloquent\Collection::pagination()

也许有另一种方法可以通过 hasMany 关系的计数进行排序 - 在本例中为“位置”。 (附带问题;我不知道如何使用 hasManyThrough 关系进行上述工作)。

模型关系如下图

public function locations()
{
    return $this->hasMany('App\Location');
}

public function equipment()
{
    return $this->hasManyThrough('App\Equipment', 'App\Location');
}

使用类似下面的东西给出了一个未定义的“make”方法?

return Paginator::make($companies->all(), $companies->getTotal(), $companies->getPerPage())

【问题讨论】:

  • 这是 laravel 5;我认为分页自 4 以来发生了重大变化?
  • 我认为基本的困境是一样的。一旦你有了一个集合,数据库查询就完成了,所以此时你能做的最好的就是分块完整的结果。因此,您需要(显然)在 db 查询对象上的相关且显然未预定义的点上的自定义分页对象(关系过滤器,我想?)但平心而论,我从未接触过 laravel,我只是想它的花花公子,喜欢阅读有关它的问题。

标签: php pagination laravel-5


【解决方案1】:

这是我编辑的答案,sort By命令和分页确实可以一起工作,以下应该适合你,当然你可能需要调整scopes join语句中的列。

将此函数添加到您的 Company 类中。

    public function scopeLocationCount($query){
    return $query->join('locations','locations.company_id','=','companies.id')
            ->selectRaw('companies.*, count(locations.id) as count')->where('locations.status','=','active')->groupBy('companies.id');
}

然后你可以像这样调用 paginate 方法。

$companies= (Company::with('locations')->locationCount()->orderBy('count')->paginate(30));

然后在你编写你的 foreach 循环来显示你需要渲染分页器的细节之后,像这样{!! $companies->render() !!}

希望这会有所帮助。

【讨论】:

  • 如果我按照你的建议去做;每个页面都将按计数排序 - 我希望整个集合按计数排序。
  • 然后将分页调用移到 sortBy 之后。
  • 我对答案进行了更改,幸运的是我必须自己解决同样的问题,我发现这对我有用。
  • 上面的问题是它现在只会返回具有关系(并且具有 where 条件)并按计数排序的公司 - 我希望结果还包括计数为零的条目(并且仍然只“计数”/“排序”活动的位置)@Azeame
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 2022-01-22
  • 2021-07-14
  • 2021-01-25
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多