2014-10-03 12 views
6

Mam dwa zapytania, pierwszy daje mi tablicę identyfikatorów, która jest w określonej kolejności. Wtedy tablica identyfikatorów mijam go do drugiego zapytania tak:Laravel MySQL, jak zamówić wyniki w tej samej kolejności, co w klauzuli whereIn

Operation::whereIn('id', $ids)->get(); 

Ale kiedy wyjście wynik tego zapytania, kolejność uległa zmianie, jeśli tablicy $ ids było coś jak (4,2, 6,9), która jest w kolejności, w której chciałbym, aby wyniki były, wynik da mi 2,4,6,9. Jak mogę tego uniknąć?

Odpowiedz

9

MySQL sposób sortowania z celem samym jak w where in klauzuli:

$ids; // array of ids 
$placeholders = implode(',',array_fill(0, count($ids), '?')); // string for the query 

Operation::whereIn('id', $ids) 
    ->orderByRaw("field(id,{$placeholders})", $ids)->get(); 
+0

mmh, naprawdę nie działa, nie wiem dlaczego –

+0

To prawda, że ​​identyfikatory były traktowane jak pojedynczy ciąg. Teraz jest dobrze –

3

Można zrobić

$idsImploded = implode(',',$ids); 
Operation::whereIn('id', $ids)->orderByRaw("FIND_IN_SET('id','$idsImploded')")->get(); 

To problem gdzie MySQL nie zwraca wynik w kolejności ich określenia, więc trzeba uporządkować je później.

Podobne rozwiązanie można znaleźć tutaj: avoid Sorting by the MYSQL IN Keyword

+0

Syntax error lub dostępu naruszenie: 1582 Nieprawidłowa liczba parametrów w wywołaniu natywną funkcję 'FIND_IN_SET' (SQL: select * from ' operacje' gdzie 'id' w (42, 3, 4, 37, 16, 38, 39, 14, 17) uporządkowane według FIND_IN_SET (id, 42,3,3,7,16,38,39,14,17)) Naprawiono. –

+0

Naprawiono. Zapomniałem dodać argumentów "do FIND_IN_SET". –

1

Jeśli kolejność sortowania w 4,2,6,9, można pobrać te wiersze, a następnie użyć php do sortowania.

+0

Potrzebuję być w stanie użyć elokwentnego później, aby uzyskać więcej informacji z tabel związanych z operacjami, w jaki sposób mogę posortować obiekt zwracany przez to zapytanie bez utraty tej możliwości? –

+0

Zgodnie z moim zdaniem chcę wykonać $ operacje-> zdarzenie-> nazwa, gdzie zdarzenie jest powiązaną tabelą, a operacje pochodzą z zapytania w moim pytaniu. –

+0

możesz umieścić wszystkie informacje najpierw a następnie sortować – ajreal

Powiązane problemy