web-dev-qa-db-ja.com

ランダム行laravel-5を取得する方法

L-4では簡単でした。

$random_quote = Quotation::all()->random(1);

しかし、現在、L-5では、この投稿で説明されている単一のメソッドは機能していません。 Laravel-EloquentまたはFluent random row

ビューファイルが空白になります。何か案は?

編集:

解決済み:$ random_quote = Quotation :: orderByRaw( "Rand()")-> first();

37
Peter

Laravel 5.4の更新

Laravel 5.4->inRandomOrder()->first()の新しいランダムソート

18
Peter

これらは動作しますが、おそらく正しいnamespaceを使用しなかったので、use名の先頭にあるclassステートメントを次のように使用します。

<?php namespace SomeNamespace;

use App\Quotation; // Says "Quotation.php" is in "App" folder (By default in L-5.0)

class someClass {
    //...
}

次に、methodで次のように使用できます。

// You may add: use DB; at the top to use DB instead of \DB
$random_quote = Quotation::orderBy(\DB::raw('Rand()'))->first();

またはこれ:

$random_quote = Quotation::orderByRaw("Rand()")->first();

更新(Laravel-5.2)以降:

$random_quote = Quotation::inRandomOrder()->first();
42
The Alpha

random()は5.2でエラーになるため、代わりにinRandomOrderを使用できます https://laravel.com/docs/5.2/queries#ordering-grouping-group-limit-and-offset

そして、それは次のような雄弁で動作します

Model::inRandomOrder()->first()
28
ctf0

LARAVEL 5.3

これがネイティブクエリ関数になったことを嬉しく思います! :D

inRandomOrderメソッドを使用して、クエリ結果をランダムに並べ替えることができます。たとえば、このメソッドを使用してランダムユーザーを取得できます。

$randomUser = DB::table('users')
            ->inRandomOrder()
            ->first();

残念ながら、これらの回答はいずれもLaravel 5のコレクションを完全に活用していません。私のようにGoogleからここに来た場合は、完全にネイティブなソリューションを探してください。

The Alphaからの回答にはデータベース依存性の欠陥があり、彼が指摘したように、Benjaminの間に行が削除されると問題が発生する可能性があります。可能性は非常に低いですが、まだ可能です。

Laravel 5+でランダムな行を選択するための1行のソリューション

// The setup
$numberOfRows = 4;
$models = Model::all(); // or use a ::where()->get();

// And the actual randomisation line
$randRows = $models->shuffle()->slice(0,numberOfRows);

出来上がり-ハッピーコーディング!あなたがそれを見たら投票してください、それでそれはページで上がります:)

12
Stan Smulders

OrderByRaw( 'Rand()')には2つの問題があります。

  1. MySQLサーバーに依存しています
  2. 大きなテーブルでは遅くなる可能性があります(すべての行をフェッチします)

ここに私が使用した解決策がありますが、それは少し優れているようです:

$cnt = $records->count();
if ($cnt == 0)
    return;

$randIndex = Rand(0, $cnt-1);
$obj = $records->skip($randIndex)->take(1)->first();

編集:データベースへの並列リクエストの場合、「count()」と「skip()」の間でいくつかのレコードが削除された場合、私のソリューションが問題になる可能性があることに注意してください。

12
Benjamin Piette

Benjaminのアイデア を使用して、これを少し異なる方法で実装します。 Query Scope これは適切だと感じるので再利用可能であり、通常のEloquentの使用に分類されます。

注:Eloquent 5.2では、グローバルスコープのサポートが組み込まれています。

モデルが利用できる特性を作成しますが、特定のモデルにscopeRandomメソッドを直接追加できます。

/ app/GlobalScopes.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

trait GlobalScopes
{
    public function scopeRandom($query){
        $totalRows = static::count() - 1;
        $skip = $totalRows > 0 ? mt_Rand(0, $totalRows) : 0;

        return  $query->skip($skip)->take(1);
    }
}

次に、グローバルスコープを使用する各モデルで、クラス内のトレイトに名前を付けます。

/ app/Quotation.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Quotation extends Model
{
    use GlobalScopes;

    //...
}

使用中:

$randomQuote = \Quotation::random()->first();
8
MetalFrog

Laravel 5.1(およびLaravel 5.2)では、Eloquentビルダーによって返されるrandomクラスにCollectionメソッドがあります。 。

https://laravel.com/docs/5.1/collections#available-methods

あなたの電話

$random_quote = Quotation::all()->random(1);

または

$random_quote = Quotation::where('column', 'value')->get()->random(1);

正しく動作するはずです。

3
fsavina

ララヴェル5.4

1)1つのランダムモデルが必要な場合:

$object = Model::all()->random();

2)多数のランダムモデルが必要な場合:

$object = Model::all()->random($n); //$n - number of elements
                                    //$object - collection

コメント:$ collection-> random(1)を呼び出すと、1つのアイテムを持つ新しいコレクションインスタンスが返されます。このメソッドは、引数が指定されていない場合に1つのオブジェクトのみを返します。

ドキュメント参照: https://laravel.com/docs/5.4/collections#method-random

orderByRaw('Rand()')

注:残りのクエリからすべての行をRAMに取り込むため、同じクエリ内に他のフィルタがない大きなテーブルがある場合、パフォーマンスが低下します。そうでない場合はこれがオプションです

1
Luca C.