Laravel - Paginate随机记录

时间:2016-05-31 13:19:29

标签: php mysql laravel random pagination

我们如何通过laravel中的随机记录进行分页? 例如:

$products = Product::all()->orderBy(DB::raw('RAND()'));
$products->paginate(4);
$products->setPath('products');

由于随机顺序,上面将以重复记录结束。 如何保持$ products对象,以便在发出新的页面请求时,它应该过滤相同/固定的随机记录集?

2 个答案:

答案 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