paginate merged collections (或:如何根据字符串的存在进行排序)
paginate merged collections (or: how to sort by presence of a string)
我最初有这个搜索词的解决方案:
Post::where('title', 'LIKE', '%'.$searched.'%')->orWhere('content', 'LIKE', '%'.$searched.'%')->paginate(100);
我想要的:
我希望包含标题中术语的记录位于集合的顶部
我的临时解决方案:
很明显:
$posts1 = Post::where('title', 'LIKE', '%'.$searched.'%')->paginate(100);
$posts2 = Post::where('content', 'LIKE', '%'.$searched.'%')->paginate(100);
$object = $posts1->merge($posts2);
有待解决的问题
$object
collection无法分页。我收到错误 Method hasPages does not exist.
。
有什么方法可以在结果(排序和合并)上保留分页功能 collection?
为什么不用
->orderByRaw()
他们使用
'(case when title LIKE "%'.$searched.'%" then 1 else 2 end) ASC'
因此名字中包含$searched
的人将排在最前面
所以您的查询构建器会像这样
Post::where('title', 'LIKE', '%'.$searched.'%')
->orWhere('content', 'LIKE', '%'.$searched.'%')
->orderByRaw('(case when title LIKE "%'.$searched.'%" then 1 else 2 end) ASC')
->paginate(100);
我最初有这个搜索词的解决方案:
Post::where('title', 'LIKE', '%'.$searched.'%')->orWhere('content', 'LIKE', '%'.$searched.'%')->paginate(100);
我想要的:
我希望包含标题中术语的记录位于集合的顶部
我的临时解决方案:
很明显:
$posts1 = Post::where('title', 'LIKE', '%'.$searched.'%')->paginate(100);
$posts2 = Post::where('content', 'LIKE', '%'.$searched.'%')->paginate(100);
$object = $posts1->merge($posts2);
有待解决的问题
$object
collection无法分页。我收到错误 Method hasPages does not exist.
。
有什么方法可以在结果(排序和合并)上保留分页功能 collection?
为什么不用
->orderByRaw()
他们使用
'(case when title LIKE "%'.$searched.'%" then 1 else 2 end) ASC'
因此名字中包含$searched
的人将排在最前面
所以您的查询构建器会像这样
Post::where('title', 'LIKE', '%'.$searched.'%')
->orWhere('content', 'LIKE', '%'.$searched.'%')
->orderByRaw('(case when title LIKE "%'.$searched.'%" then 1 else 2 end) ASC')
->paginate(100);