簡體   English   中英

Laravel:使用分頁顯示來自mysql的10個隨機行的查詢

[英]Laravel: Display query with 10 random rows from mysql with paginate

我想從數據庫中獲取10個隨機行,然后在分頁上顯示它。 一頁應該只顯示1 row ,下一頁按鈕應該顯示下一row等等。另外,我的列包含類別ID,因此對於第一頁,我想顯示cat_id = 1行,對於第三頁,我想顯示具有cat_id = 3cat_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM