Php 对合并的集合进行分页(或:如何按字符串的存在进行排序)
我最初有一个搜索术语的解决方案:Php 对合并的集合进行分页(或:如何按字符串的存在进行排序),php,laravel,collections,eloquent,laravel-5.3,Php,Laravel,Collections,Eloquent,Laravel 5.3,我最初有一个搜索术语的解决方案: Post::where('title', 'LIKE', '%'.$searched.'%')->orWhere('content', 'LIKE', '%'.$searched.'%')->paginate(100); 我想要的是: 我希望标题中包含一个术语的记录位于集合的顶部 我的临时解决办法: 很明显: $posts1 = Post::where('title', 'LIKE', '%'.$searched.'%')->paginate
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
集合进行分页。我得到错误方法hasPages不存在。
。
有没有办法在生成的(已排序和合并的)集合上保留分页功能?为什么不使用
->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);
为什么不改用
union
?只需合并这两个select查询相同的错误:方法hasPages不存在。
当您使用union
时会发生该错误?不,抱歉,已粘贴。当使用您的解决方案时,我得到SQLSTATE[21000]:基数冲突:1222使用的SELECT语句有不同的列数(SQL:(选择count(*)作为聚合自posts`wherecontent
LIKE%konf%)联合(SELECT*fromposts
title
LIKE%konf%)`您可以截屏(显示)更新的代码。此外,当您使用联合查询时,它必须在其上指定相同数量的列。您的答案似乎非常有希望,但我不知道如何修复语法。如果我使用您的代码,我会在“order子句”中得到列未找到:1054未知列“(当名称像“%konf%”那么1 else 2)”
这给了我语法错误:->orderByRaw(“当标题像%konf%那么1 else 2 END ASC时的情况”)
有任何提示吗?(注意:为了简化调试,我硬写了搜索词。)错误显示:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,了解正确的语法…
@Peter ops我忘了在orderByRaw的开头添加“case”。在末尾加上“end”,我自己纠正了。我仍然有语法错误。我不知道出了什么事。@Peter出了什么错?我测试了这个查询生成器,它没有生成任何错误