Jak mogę wybrać losowy wiersz za pomocą Eloquent lub Fluent w frameworku Laravel?
Wiem, że używając SQL, możesz zrobić porządek za pomocą RAND (). Chciałbym jednak uzyskać losowy wiersz bez liczenia liczby rekordów przed początkowym zapytaniem.
Jakieś pomysły?
Odpowiedzi:
Laravel> = 5,2:
lub
lub uzyskać określoną liczbę rekordów
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Sprawdź ten artykuł na temat losowych wierszy MySQL. Laravel 5.2 obsługuje to, w przypadku starszych wersji nie ma lepszego rozwiązania niż używanie zapytań RAW .
edycja 1: Jak wspomniano w Double Gras, orderBy () nie zezwala na nic innego niż ASC lub DESC od tej zmiany. Zaktualizowałem odpowiednio swoją odpowiedź.
edycja 2: Laravel 5.2 wreszcie implementuje w tym celu funkcję otoki . Nazywa się on inRandomOrder () .
źródło
'RANDOM()'
To działa dobrze,
możesz także zmienić argument w funkcji losowej, aby uzyskać więcej niż jeden rekord.
Uwaga: niezalecane, jeśli masz ogromne dane, ponieważ najpierw pobierze wszystkie wiersze, a następnie zwróci losową wartość.
źródło
tl; dr: Obecnie jest zaimplementowany w Laravel, patrz „edycja 3” poniżej.
Niestety, na dzień dzisiejszy istnieją pewne zastrzeżenia dotyczące
->orderBy(DB::raw('RAND()'))
proponowanego rozwiązania:RANDOM()
Co gorsza, to rozwiązanie nie ma już zastosowania, ponieważ ta zmiana :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edycja: Teraz możesz użyć metody orderByRaw () :
->orderByRaw('RAND()')
. Jednak nadal nie jest to agnostyk DB.FWIW, CodeIgniter implementuje specjalną
RANDOM
kierunek sortowania, który jest zastępowany poprawną gramatyką podczas budowania zapytania. Wydaje się również, że jest dość łatwy do wdrożenia. Wygląda na to, że mamy kandydata na ulepszenie Laravela :)aktualizacja: tutaj jest problem na GitHub i moje oczekujące żądanie ściągnięcia .
edycja 2: Wytnijmy pościg. Od wersji Laravel 5.1.18 możesz dodawać makra do konstruktora zapytań:
Stosowanie:
edycja 3: Wreszcie! Od wersji Laravel 5.2.33 (dziennik zmian , PR # 13642 ) możesz używać metody natywnej
inRandomOrder()
:źródło
W Laravel 4 i 5
order_by
otrzymuje brzmienie :orderBy
Powinno to być:
źródło
Możesz użyć :
źródło
Dla Laravela 5.2> =
użyj Elokwentnej metody:
Do losowego sortowania wyników zapytania można użyć metody inRandomOrder. Na przykład możesz użyć tej metody, aby pobrać losowego użytkownika:
z dokumentów: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
źródło
Możesz także użyć metody order_by z płynnym i wymownym, takim jak:
To trochę dziwne użycie, ale działa.
Edycja: Jak powiedział @Alex, to użycie jest czystsze i działa również:
źródło
Użyj funkcji Laravela
źródło
Możesz łatwo użyć tego polecenia:
// Pytanie: nazwa modelu
// weź 10 wierszy z DB W losowych rekordach ...
źródło
Wolę określić jako pierwszy lub nie:
źródło
Laravel ma wbudowaną metodę zmiany kolejności wyników.
Oto cytat z dokumentacji:
Metoda losowania losowo przetasowuje elementy w kolekcji:
Tutaj możesz zobaczyć dokumentację .
źródło
Dodaj do swojego modelu:
następnie na trasie / kontrolerze
źródło
Istnieje również
whereRaw('RAND()')
który robi to samo, można wtedy łańcuch->get()
lub->first()
nawet zaszaleć i dodać->paginate(int)
.źródło
Mam tabelę z tysiącami rekordów, więc potrzebuję czegoś szybko. To jest mój kod dla pseudolosowego wiersza:
źródło
$count
tylko pierwszy z nich byłby kiedykolwiek odzyskany, a zatem bardziej prawdopodobne jest, że zostanie on pobrany niż jakikolwiek inny wiersz.