我几乎要放弃,因为我已经坚持了很长时间。 我希望你能帮助我。
目标
我想以无限滚动方式返回分页并缓存的查询。 我正在使用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中也是如此,但这只是每次在缓存中使用不同的“键”。
答案 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'));之后尝试此操作