【问题标题】:Laravel - Shuffle Merge and Paginate CollectionLaravel - 随机合并和分页集合
【发布时间】:2019-10-29 04:52:35
【问题描述】:

我正在为一件非常困难的事情而苦苦挣扎,希望你能帮助我。 现在我有以下内容:

$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)"));

信息: 这是有效的,因为它是一个雄辩的集合,我可以分页(需要我的无限滚动)

但现在我想对 ad_types 本身进行洗牌,意思是: ad_type 1 可以有 30 个条目。它们都将按通常的顺序退回。每次运行此查询时,我都想对这 30 个进行洗牌。 我想过做 ->toArray();但话又说回来,没有分页(分页只适用于雄辩的查询,对吧?)

然后我想,嘿,让我们合并它。 但是一旦我这样做了,返回的集合不再是 Eloquent 集合,而是支持集合(对吗?我不能 100% 确定它是支持集合),因此分页不再起作用。

我阅读了许多关于如何解决此问题的帖子,并发现一种解决方案可能是“创建我自己的分页器实例” 但是,见鬼,我还没有那么好。我真的不知道,即使在研究了 laravel 文档之后,如何创建自己的分页器。

您可能需要的重要信息: 使用 Laravel 5.2 $ads 是动态的,这意味着根据具体情况,使用 Ajax 发送的请求,查询可能会在以后有所不同(可能会包含某些内容)。

非常感谢您抽出宝贵时间阅读本文,希望您能通过解决这个特定问题来帮助我和未来的读者。

大家好,祝大家周末愉快。

【问题讨论】:

    标签: laravel collections eloquent paginator


    【解决方案1】:

    首先要注意: 分页不仅适用于数据库查询。您可以使用LengthAwarePaginator 手动分页,但这里的关键字是手动。 查询构建器(不是 Eloquent)可以使用 paginate 自动为您完成。

    您可以通过执行类似的操作来“打乱”结果

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

    【讨论】:

    • 首先比你付出了很多时间和精力。如果我可能会问这个问题:这会打乱 ad_type 1、2 和 3 本身吗,例如 ad_type 1 由 [a,b,c] 组成,我希望每次运行查询时都打乱这个内容.我想我最初的问题可能不够清楚。
    • 假设广告类型 1 具有 [a, b, c ],广告类型 2 具有 [d, e],那么当您运行此查询时,您首先会以随机顺序得到 [d,e],然后是 [a,b ,c] 以随机顺序排列。每次运行时,内部顺序都会改变,但广告类型的顺序保持不变
    • 我会尽快测试一下。如果这是我的解决方案,请将此帖子标记为解决方案,并将为未来的读者编辑我的初始问题。非常感谢您的时间:) 非常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2019-04-14
    • 1970-01-01
    • 2015-12-16
    • 2013-02-20
    • 2015-06-06
    • 2021-12-13
    相关资源
    最近更新 更多