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 字段排序,然后按随机数(每行不同)排序。