2014-10-03 13 views
6

Ho due query, la prima mi dà una matrice di ID, che è in un ordine specifico. Poi quella matrice di ID lo passo per la seconda query in questo modo:Laravel MySQL come ordinare i risultati nello stesso ordine della clausola whereIn

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

Ma quando sono uscita il risultato di tale richiesta, l'ordine è cambiato, se l'array $ ids era qualcosa di simile (4,2, 6,9) che è l'ordine in cui volevo ottenere i risultati, l'output mi darà 2,4,6,9. Come posso evitarlo?

risposta

9

MySQL modo di smistamento con ordine come nel where in clausola:

$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, non funziona davvero, non so perché –

+0

È vero, gli ID sono stati trattati come una stringa singola. Adesso va bene –

3

Si può fare

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

E 'un problema in cui MySql non restituisce il risultato nell'ordine li specificato, quindi è necessario riordinarle dopo.

Una soluzione simile può essere trovato qui: avoid Sorting by the MYSQL IN Keyword

+0

Errore di sintassi o violazione di accesso: 1582 errato conteggio dei parametri nella chiamata a 'FIND_IN_SET' funzione nativa (SQL: select * from ' operations' dove 'id' in (42, 3, 4, 37, 16, 38, 39, 14, 17) ordina per FIND_IN_SET (id, 42,3,4,37,16,38,39,14,17)) –

+0

corretto. Ho dimenticato di aggiungere "" agli argomenti FIND_IN_SET. –

1

Se avete l'ordine di selezione, 4,2,6,9, è possibile recuperare queste righe, quindi usare php per ordinare.

+0

Ho bisogno di essere in grado di usare eloquente in seguito per ottenere maggiori informazioni dalle tabelle relative alle operazioni, come posso ordinare l'oggetto restituito da quella query senza perdere tale capacità? –

+0

Come in, a mio avviso voglio fare $ operazioni-> evento-> nome, dove l'evento è una tabella correlata e le operazioni sono ciò che viene dalla query nella mia domanda. –

+0

puoi mettere tutte le informazioni prima quindi fai sort – ajreal

Problemi correlati