[英]Laravel: Display query with 10 random rows from mysql with paginate
我想從數據庫中獲取10個隨機行,然后在分頁上顯示它。 一頁應該只顯示1 row
,下一頁按鈕應該顯示下一row
等等。另外,我的列包含類別ID,因此對於第一頁,我想顯示cat_id = 1
行,對於第三頁,我想顯示具有cat_id = 3
行cat_id = 3
。 請告訴我有可能嗎? 我不知道該怎么做。
現在我有控制器:
$rows=Row::all()->random(10)->paginate(1);
它說沒有paginate
方法:(
當paginate
擴展查詢構建器時, all()
方法返回一個Collection。 因此,如果您不需要任何隨機結果,可以像這樣直接調用分頁
$rows=Row::paginate(1);
現在,random的問題在於它可以在Collection上使用,因此您不能在調用分頁之前直接使用它,因此在這里我將使用orderByRaw('RAND()')
例如,要對行進行隨機排序並僅獲得cat_id與當前頁碼相同的第一行,您可以執行以下操作:
$rows=Row::orderByRaw('RAND()')->groupBy('cat_id')->orderBy('cat_id', 'asc')->paginate(1);
我假設這里的cat_id中沒有空格。
要在請求之間給出“一致”的順序,您必須維護一些其他信息(在這種情況下為整數種子)。 您也許可以將此作為附加的GET參數傳遞或將其存儲在會話中。 之后,您可以簡單地將該種子添加到$ rows查詢中,如下所示:
$rows=Row::orderByRaw('RAND('.$seed.')')->groupBy('cat_id')->orderBy('cat_id', 'asc')->paginate(1);
為了將種子存儲在會話中,這應該足夠了,
Session::reflash();
if(!Session::has('rand.key')) {
$seed = Session::get('rand.key');
} else {
$seed = rand();
Session::flash('rand.key', $seed);
}
使用SQL隨機函數而不對分頁碼刷新順序的唯一方法是使用種子號。
$results = Row::orderByRaw('RAND(::SEED_NUMBER::)')->take(10)->get();
$rows = (new \Illuminate\Pagination\Paginator($results, 1));
:: SEED_NUMBER ::是您想更改訂單時需要更改的編號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.