Laravel - 随机合并和分页集合
Laravel - Shuffle Merge and Paginate Collection
我正在为一件非常困难的事情而苦苦挣扎,希望你能帮助我。
现在我有以下内容:
$ads = Ad::where('status', 1)
->whereIn('ad_type', [1, 2, 3])
->where('expire_at', '>', date('Y-m-d H:i:s'))
->where('special_ad', 'standard_ad')
->orderByRaw(DB::raw("FIELD(ad_type,2,3,1)"));
信息:
这是有效的,因为它是一个 Eloquent 集合,我可以对其进行分页(我的无限滚动需要)
但现在我想随机播放 ad_types 本身 ,意思是:
ad_type 假设 1 可以有 30 个条目。它们都将按通常的顺序返回。每次我 运行 这个查询时,我都想随机播放这 30 个。
我想过做 ->toArray();但话又说回来,没有分页(分页只适用于 Eloquent 查询,对吗?)
然后我想,嘿,我们合并吧。
但是一旦我这样做,返回的集合就不再是一个 Eloquent 集合而是一个支持集合(对吗?我不是 100% 确定它是一个支持集合)因此分页不再起作用。
我阅读了很多关于如何解决这个问题的帖子,并想出一个解决方案可能是 "create my own paginator instance"
但是见鬼,我还没有那么好。我真的不知道,即使在研究了 laravel 文档之后,如何创建我自己的分页器。
您可能需要的重要信息:
使用 Laravel 5.2
$ads
是动态的,这意味着根据情况,使用 Ajax 发送的请求,稍后查询可能会有所不同(可能包含某些内容)。
非常感谢您花时间阅读本文,希望您能帮助我和未来的读者解决这个特殊问题。
问候,祝大家周末愉快。
首先要注意:
分页不仅适用于数据库查询。您可以使用 LengthAwarePaginator
手动分页,但手动是此处的关键字。 查询构建器(不是Eloquent)可以使用paginate
自动为您完成。
您可以 "shuffle" 通过执行类似
的操作来获得结果
$ads = Ad::where('status', 1)
->whereIn('ad_type', [1, 2, 3])
->where('expire_at', '>', date('Y-m-d H:i:s'))
->where('special_ad', 'standard_ad')
->orderByRaw("FIELD(ad_type,2,3,1)")
->orderByRaw("RAND()");
这将首先按 ad_type 字段排序,然后按随机数(每行不同)排序。
我正在为一件非常困难的事情而苦苦挣扎,希望你能帮助我。 现在我有以下内容:
$ads = Ad::where('status', 1)
->whereIn('ad_type', [1, 2, 3])
->where('expire_at', '>', date('Y-m-d H:i:s'))
->where('special_ad', 'standard_ad')
->orderByRaw(DB::raw("FIELD(ad_type,2,3,1)"));
信息: 这是有效的,因为它是一个 Eloquent 集合,我可以对其进行分页(我的无限滚动需要)
但现在我想随机播放 ad_types 本身 ,意思是: ad_type 假设 1 可以有 30 个条目。它们都将按通常的顺序返回。每次我 运行 这个查询时,我都想随机播放这 30 个。 我想过做 ->toArray();但话又说回来,没有分页(分页只适用于 Eloquent 查询,对吗?)
然后我想,嘿,我们合并吧。 但是一旦我这样做,返回的集合就不再是一个 Eloquent 集合而是一个支持集合(对吗?我不是 100% 确定它是一个支持集合)因此分页不再起作用。
我阅读了很多关于如何解决这个问题的帖子,并想出一个解决方案可能是 "create my own paginator instance" 但是见鬼,我还没有那么好。我真的不知道,即使在研究了 laravel 文档之后,如何创建我自己的分页器。
您可能需要的重要信息:
使用 Laravel 5.2
$ads
是动态的,这意味着根据情况,使用 Ajax 发送的请求,稍后查询可能会有所不同(可能包含某些内容)。
非常感谢您花时间阅读本文,希望您能帮助我和未来的读者解决这个特殊问题。
问候,祝大家周末愉快。
首先要注意:
分页不仅适用于数据库查询。您可以使用 LengthAwarePaginator
手动分页,但手动是此处的关键字。 查询构建器(不是Eloquent)可以使用paginate
自动为您完成。
您可以 "shuffle" 通过执行类似
的操作来获得结果$ads = Ad::where('status', 1)
->whereIn('ad_type', [1, 2, 3])
->where('expire_at', '>', date('Y-m-d H:i:s'))
->where('special_ad', 'standard_ad')
->orderByRaw("FIELD(ad_type,2,3,1)")
->orderByRaw("RAND()");
这将首先按 ad_type 字段排序,然后按随机数(每行不同)排序。