我们如何通过laravel中的随机记录进行分页? 例如:
$products = Product::all()->orderBy(DB::raw('RAND()'));
$products->paginate(4);
$products->setPath('products');
由于随机顺序,上面将以重复记录结束。 如何保持$ products对象,以便在发出新的页面请求时,它应该过滤相同/固定的随机记录集?
答案 0 :(得分:13)
当你深入了解documentation 的mysql并搜索RAND()功能时,你会看到你可以使用"种子"。
通过使用种子,您将始终获得随机化的相同结果。
示例:
$products = Product
::all()
->orderBy(DB::raw('RAND(1234)'))
->paginate(4);
您可以生成自己的种子并存储在会话或其他内容中以便记住它。
<强>更新强>
Laravel query builder现在有一个完全相同的功能:
$products = Product
::all()
->inRandomOrder('1234')
->paginate(4);
答案 1 :(得分:0)
解决方案Ajax +块+会话+延迟加载+分页+雄辩+刀片
获取所有产品,设置每个块的项目数(例如分页)并将其存储到会话中(我们将块存储到会话中,因此当ajax请求到来时,它将不再调用foobar
),第一个分块将是第一个分页
当ajax请求更多产品时,它将从会话中获取产品,并根据请求的ajax页码获取正确的产品块。
如果没有更多的块,就不带任何产品退货
$products = Product::inRandomOrder()->get();
products.blade.php:主页
if(!$request->ajax()){
$products = Product::inRandomOrder()->get();
$chunks = $products->chunk(4);
\Session::put('chunks',$chunks);
$products = $chunks[0];
}else{
$page = $request->all()['page'];
$chunks = \Session::get('chunks');
if(count($chunks)<$page){
\Session::forget('chunks');
return;
}else{
$products = $chunks[$page-1];
}
}
if ($request->ajax()) {
$view = view('product_lazyLoad',compact('products'))->render();
return response()->json(['html'=>$view]);
}
return view('products',compact('products'));
product_lazyload.blade.php:显示产品
@if($products)
<ul class="row" id="productLists">
@include('product_lazyLoad')
</ul>
@endif
<!-- load records -->
<div class="col-12 ajax-load text-center" style="display:none">
<p><img src="/images/loader.gif">Loading More Products</p>
</div>
font-end ajax调用:当页面滚动到页面底部时,可变页面将自动递增并请求后端提供更多产品。如果返回更多产品,它将把产品添加到products.blade.php中ID为“ productlist”的元素上
@foreach($products as $product)
<div>
<p>Display your products here</p>
</div>
@endforeach