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
'programing' 카테고리의 다른 글
| !== "displicate" vs. != null 유형 (0) | 2023.01.17 |
|---|---|
| 옵션이 설정된 경우 BitmapFactory.decodeStream이 null을 반환합니다. (0) | 2023.01.17 |
| Python에서 "raise" 키워드를 사용하는 방법 (0) | 2022.12.24 |
| 서로 다른 데이터베이스 간의 MySQL InnoDB 외부 키 (0) | 2022.12.24 |
| 마리아에서의 Datetime current_timestampDB (0) | 2022.12.24 |