Laravel-使用mysql Rand()和Seed进行分页

时间:2019-06-18 11:18:20

标签: mysql laravel caching queue

我几乎要放弃,因为我已经坚持了很长时间。 我希望你能帮助我。

目标

我想以无限滚动方式返回分页并缓存的查询。 我正在使用Ajax从视图向控制器进行调用,并获取“ nextPageUrl()”并将其保存在视图中。

问题

我的查询返回内部数组的随机顺序(它们也在第一级上排序),这很好。但是查询也会在我每次进行ajax调用时运行。所以我想:嘿,让我们缓存它,这样我每次进行Ajax调用时都会有相同的查询,而且不再重复。但是我执行的每个ajax请求都会出现重复项。

我尝试过的事情:

这是我的查询,该查询已被缓存并分页:

X:Name="TB"

inRandomOrder(); 方法等同于 orderByRaw(“ RAND()”)

我发现以下不幸的是对我来说不起作用: Laravel Random Pagination Cache

我不想写太多,因为在这里有一堵代码墙可能会造成混淆,如果您需要对代码进行更彻底的说明或更多代码段,或者我的“处理方式已说明”,请让我知道。 预先感谢您对我们的支持。 问候,Desory。

编辑::我尝试在inRandomOrder($ seed)中使用$ seed作为参数,但是即使种子不同,这也会一遍又一遍地返回相同的查询。

更接近解决方案 我尝试使用固定的$ seed值,就我而言,我只输入了25 因此种子始终为25,不再重复,很好,但是顺序现在始终相同。 我基本上觉得我可以在具有随机顺序和重复项,具有相同顺序但没有重复项之间进行选择。

我的Ajax功能

$counter = $request->page;

$results = Cache::remember($counter, 1, function () {
    $seed = rand(1,9999);

    return Ad::where('status', 1)
        ->whereIn('ad_type', [0, 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,1,3,0)"))
        ->inRandomOrder()
        ->paginate(15);
});


if($request->ajax()) {
    return [
        'ads' => view('partials.advanced_search_sidebar2')->with(compact('results','index'))->render(),
        'next_page' => $results->nextPageUrl(),
    ];
} else {
    return view("welcome_live", compact('results', 'usertypes'));
}

这似乎令人困惑,因为在Controller中我使用的是“计数器”,在javascript,too中也是如此,但这只是每次在缓存中使用不同的“键”。

2 个答案:

答案 0 :(得分:0)

distinct()不会给您重复数据,您应该在其中传递像id这样的属性

return Ad::where('status', 1)
    ->whereIn('ad_type', [0, 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,1,3,0)"))
    ->inRandomOrder()
    ->distinct()
    ->paginate(15);

答案 1 :(得分:-1)

在$ counters-> appends(Input :: except('page'));之后尝试此操作