2017-11-13 112 views
6

Mam tablicę identyfikatorów produktów, wobec których potrzebuję pobrać kolekcję modeli. Tablica jest mniej więcej taka:Laravel: Jak uzyskać niestandardową posortowaną elokwentną kolekcję używając metody WhereIn

$ids = array(9, 2, 16, 11, 8, 1, 18); 

Teraz używam poniższego wiersza kodu, aby pobrać kolekcję.

$products = Product::whereIn('id', $ids)->get(); 

Ale sortuje produkty na podstawie ich identyfikatorów. takie jak: 1, 2, 8, 9, 11, 16, 18. Potrzebuję tej samej kolejności, co w tablicy $ids, tj. 9, 2, 16, 11, 8, 1, 18.

Co należy zrobić, aby uzyskać tę samą kolejność, co w tablicy?

+0

To ciekawe pytanie. Powiedziałbym, że jest to raczej rodzaj niestandardowy niż nieposortowany. –

+1

Chyba znalazłem duplikat za to, że w oparciu o: https://stackoverflow.com/questions/40731863/sort-collection-by-custom-order-in-eloquent –

+0

Nie chcę, aby zamknąć swoje pytanie jako duplikat z tego, ale nie jestem w 100% pewien, że tego właśnie chcesz. Czy odpowiedź na to pytanie rozwiązuje twój problem? –

Odpowiedz

8

Zastosowanie Field() funkcja mysql (Jeśli używasz bazy danych MySQL) z DB::raw() z laravel coś jak

$products = Product::whereIn('id', $ids) 
    ->orderBy(DB::raw("FIELD(id,".join(',',$ids).")")) 
    ->get(); 

Field() zwraca indeks listy przecinkowym

+1

Och, to sprytny sposób na zrobienie tego. Będę musiał to pamiętać. –

+1

Świetnie! To interesujące i czystsze podejście. Dzięki. –

1

tutaj inny sposób na zrobienie tego.

$ids = array(9, 2, 16, 11, 8, 1, 18); 
$products = User::whereIn('id', $ids)->orderByRaw('FIELD(id, '.implode(',', $ids).')')->get();