【问题标题】:Laravel search results paginate without direct collectionLaravel 搜索结果分页不直接收集
【发布时间】:2020-05-30 10:56:29
【问题描述】:

我有一个类似的搜索:

$users = User::search($q)
               ->orderBy($sortBy, $orderBy)
               ->paginate($perPage);

我可以使用

在刀片中对结果进行分页
{{ $users->render() }}

没问题。 但是我的 SearchController 继续像

if($request->loc){
    $users = $users->where('loc',$request->loc);
}
if($request->sz) {
    $users = $users->where('sz',$request->sz);
}
...
return view('search', compact('users'));

这意味着我不能在刀片中使用 {{ $users->render() }} 因为 $users 没有 orderBy,集合的分页。

我该如何解决这个问题?谢谢解答!

【问题讨论】:

  • 您的问题很难理解,最好粘贴您用于搜索的完整方法。我猜search()User 模型上的一个范围?
  • 是的,这是正确的,它是用户模型中的一个 scopeSearch ``` public function scopeSearch($query, $q) { if ($q == null) return $query; return $query ->where('name', 'LIKE', "%{$q}%"); } ``` 重点是我直接从 User:: 集合中获取 $users,但在搜索中我过滤了相同的 $users 以用于其他搜索请求,但是当我直接使用 User:: 集合而不是传递的集合时,我只能使用分页$用户
  • 如何将数据传递给集合? collection 接受一个构建器实例,因此您应该能够传递您的查询。此外,您可以尝试在 return 之前应用 paginate,以防 laravel 取消设置分页。

标签: php laravel search


【解决方案1】:

您不应该将分页和过滤集合结合起来,这会使结果变得不稳定。如果您想使用分页过滤,您必须在 QueryBuilder 上进行。

对于您的逻辑,您可以在QueryBuilder 上使用when($condition, $clojure),只有在条件为真时才会执行。

$users = User::search($q)
           ->orderBy($sortBy, $orderBy)
           ->when($request->loc, function ($query) use ($request) {
               $query->where('loc', $request->loc);
           })
           ->when($request->sz, function ($query) use ($request) {
               $query->where('sz', $request->sz);
           })
           ->paginate($perPage);

return view('search', compact('users'));

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2017-01-12
    • 1970-01-01
    • 2021-03-24
    • 2018-01-17
    • 2019-10-03
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多