programing

Larabel - 웅변 또는 유창 랜덤 행

sourcejob 2023. 1. 17. 21:16
반응형

Larabel - 웅변 또는 유창 랜덤 행

Laravel 프레임워크에서 웅변 또는 Fluent를 사용하여 랜덤 행을 선택하려면 어떻게 해야 합니까?

SQL을 사용하면 RAND()로 주문할 수 있다는 것을 알고 있습니다.다만, 초기 쿼리 전에 레코드 수를 세지 않고 랜덤 을 취득하고 싶습니다.

좋은 생각 있어요?

Laravel > = 5.2:

User::inRandomOrder()->get();

또는 특정 레코드 수를 얻기 위해

// 5 indicates the number of records
User::inRandomOrder()->limit(5)->get();
// get one random record
User::inRandomOrder()->first();

또는 수집에 랜덤 방법을 사용합니다.

User::all()->random();
User::all()->random(10); // The amount of items you wish to receive

Larabel 4.2.7-5.1:

User::orderByRaw("RAND()")->get();

Larabel 4.0~4.2.6:

User::orderBy(DB::raw('RAND()'))->get();

라라벨 3:

User::order_by(DB::raw('RAND()'))->get();

MySQL 랜덤 행에 대한 이 문서확인하십시오.Larabel 5.2는 이를 지원하며 이전 버전에서는 RAW 쿼리를 사용하는 것보다 더 나은 솔루션은 없습니다.

편집 1: Double Gras에서 설명한 바와 같이 orderBy()는 이 변경 이후 ASC 또는 DESC 이외의 것을 허용하지 않습니다.그에 따라 답변을 업데이트했습니다.

edit 2: Larabel 5.2는 최종적으로 이를 위한 래퍼 기능을 구현했습니다.inRandomOrder()라고 불립니다.

이건 잘 먹히지만

$model=Model::all()->random(1)->first();

랜덤 함수의 인수를 변경하여 둘 이상의 레코드를 얻을 수도 있습니다.

참고: 대용량 데이터가 있는 경우 모든 행을 먼저 가져온 다음 랜덤 값을 반환하므로 권장되지 않습니다.

tl;dr: 현재는 Larabel에 구현되어 있습니다.아래의 「편집 3」을 참조해 주세요.


슬프게도, 오늘로써는, 에 대한 몇 가지 경고가 있습니다.->orderBy(DB::raw('RAND()'))제안 솔루션:

  • SQLite나 Postgre 등 DB에 의존하지 않습니다.SQL 사용RANDOM()
  • 더 나쁜 것은 이 변경으로 인해 이 솔루션은 더 이상 적용되지 않는다는 것입니다.

    $direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';


edit : orderByRaw() 메서드를 사용할 수 있게 되었습니다.->orderByRaw('RAND()')그러나 이것은 여전히 DB-agnostic은 아닙니다.

FWIW, CodeIgniter는 스페셜을 구현합니다.RANDOM정렬 방향 - 쿼리를 작성할 때 올바른 문법으로 대체됩니다.또, 실장도 꽤 간단해 보입니다.Laravel을 개선할 수 있는 후보가 있는 것 같습니다.

업데이트: GitHub에 관한 이슈와 보류 인 풀 요청입니다.


편집 2: 추격을 중단합시다.Larabel 5.1.18 이후 쿼리 빌더에 매크로를 추가할 수 있습니다.

use Illuminate\Database\Query\Builder;

Builder::macro('orderByRandom', function () {

    $randomFunctions = [
        'mysql'  => 'RAND()',
        'pgsql'  => 'RANDOM()',
        'sqlite' => 'RANDOM()',
        'sqlsrv' => 'NEWID()',
    ];

    $driver = $this->getConnection()->getDriverName();

    return $this->orderByRaw($randomFunctions[$driver]);
});

사용방법:

User::where('active', 1)->orderByRandom()->limit(10)->get();

DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();


편집 3: 드디어!Larabel 5.2.33(changelog, PR #13642)이므로 기본 방법을 사용할 수 있습니다.inRandomOrder():

User::where('active', 1)->inRandomOrder()->limit(10)->get();

DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();

다음을 사용할 수 있습니다.

ModelName::inRandomOrder()->first();

라라벨 4와 5에서는order_by에 의해 대체됩니다.orderBy

따라서 다음과 같이 해야 합니다.

User::orderBy(DB::raw('RAND()'))->get();

매우 간단합니다. 당신의 라라벨 버전을 확인하세요.

Laravel > = 5.2:

User::inRandomOrder()->get();
//or to get the specific number of records
// 5 indicates the number of records
User::inRandomOrder()->limit(5)->get();
// get one random record
User::inRandomOrder()->first();

또는 수집에 랜덤 방법을 사용합니다.

User::all()->random();
User::all()->random(10); // The amount of items you wish to receive

Larabel 4.2.7-5.1:

 User::orderByRaw("RAND()")->get();

Larabel 4.0~4.2.6:

 User::orderBy(DB::raw('RAND()'))->get();

라라벨 3:

 User::order_by(DB::raw('RAND()'))->get();

order_by 메서드를 다음과 같이 유창하고 웅변적으로 사용할 수도 있습니다.

Posts::where_status(1)->order_by(DB::raw(''),DB::raw('RAND()')); 

이것은 조금 이상한 사용법이지만, 효과가 있습니다.

편집: @Alex가 말했듯이 이 사용법은 보다 깔끔하고 다음과 같이 동작합니다.

Posts::where_status(1)->order_by(DB::raw('RAND()'));

Larabel 5.2의 경우 >=

웅변법을 사용합니다.

inRandomOrder()

inRandomOrder 메서드를 사용하여 쿼리 결과를 랜덤으로 정렬할 수 있습니다.예를 들어, 다음 방법을 사용하여 랜덤 사용자를 가져올 수 있습니다.

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

문서 : https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

라라벨 함수 사용

ModelName::inRandomOrder()->first();

다음 명령을 쉽게 사용할 수 있습니다.

: // 문 : 델 // //
records에서 을 가져옵니다.// DB In shuffle 코개개10 개개개...

$questions = Question::orderByRaw('RAND()')->take(10)->get();

first 또는 fail을 지정하는 것이 좋습니다.

$collection = YourModelName::inRandomOrder()
  ->firstOrFail();

Laravel에는 결과의 순서를 섞는 방법이 내장되어 있습니다.

다음은 설명서에서 인용한 내용입니다.

shuffle()

shuffle 메서드는 컬렉션의 항목을 임의로 섞습니다.

$collection = collect([1, 2, 3, 4, 5]);

$shuffled = $collection->shuffle();

$shuffled->all();

// [3, 2, 5, 1, 4] - (generated randomly)

매뉴얼은 이쪽에서 보실 수 있습니다.

모델에서 다음을 추가합니다.

public function scopeRandomize($query, $limit = 3, $exclude = [])
{
    $query = $query->whereRaw('RAND()<(SELECT ((?/COUNT(*))*10) FROM `products`)', [$limit])->orderByRaw('RAND()')->limit($limit);
    if (!empty($exclude)) {
        $query = $query->whereNotIn('id', $exclude);
    }
    return $query;
}

루트/컨트롤러에 있는 경우

$data = YourModel::randomize(8)->get();

, there있있 there 도 있다.whereRaw('RAND()') '연쇄'를 할 수 있습니다.->get() ★★★★★★★★★★★★★★★★★」->first() 수도 있고, '미쳐라'를 붙일 수도 있다.->paginate(int).

수천 장의 레코드가 있는 테이블이 있어서 빨리 필요한 게 있어요의사 랜덤 행의 코드는 다음과 같습니다.

// count all rows with flag active = 1
$count = MyModel::where('active', '=', '1')->count(); 

// get random id
$random_id = rand(1, $count - 1);  

// get first record after random id
$data = MyModel::where('active', '=', '1')->where('id', '>', $random_id)->take(1)->first(); 

프로젝트 중 하나에서 언변으로 무작위 결과를 얻을 수 있는 방법은 다음과 같습니다.

$products           =  Product::inRandomOrder()->limit(10);

10 - 풀할 랜덤레코드 수

이 코드를 사용해 보세요!기능:

  User::orderBy(DB::raw('RAND()'))->get();

Laravel 7.x 이상에서는 다음 작업을 수행할 수 있습니다.

$data = Images::all()->random(4);

언급URL : https://stackoverflow.com/questions/13917558/laravel-eloquent-or-fluent-random-row

반응형