2014-04-15 21 views
24

Come faccio a eseguire questo in Query Builder di Laravel 4.1?Laravel Query Builder dove max id

select * from orders where id = (select max(`id`) from orders) 

Ho provato questo, funziona ma non riesco a ottenere la caratteristica eloquente.

DB::select(DB::raw('select * from orders where id = (select max(`id`) from orders)')); 

Qualche idea per renderlo migliore?

risposta

30

Si dovrebbe essere in grado di eseguire una selezione sulla tabella Ordini, utilizzando un grezzo dove trovare il massimo (id) in una subquery, come questo:

DB::table('orders')->where('id', DB::raw("(select max(`id`) from orders)"))->get(); 

Se si desidera utilizzare Eloquent (ad esempio, in modo da poter convertire la risposta a un oggetto), si desidera utilizzare whereRaw, poiché alcune funzioni come toJSON o toArray non funzioneranno senza l'uso di modelli Eloquent.

$order = Orders::whereRaw('id = (select max(`id`) from orders)')->get(); 

Ciò, ovviamente, richiede che si disponga di un modello che estende Eloquent.

class Orders extends Eloquent {} 

Come accennato nei commenti, non è necessario utilizzare whereRaw, si può fare l'intera query utilizzando il generatore di query SQL, senza crudo.

// Using the Query Builder 
DB::table('orders')->find(DB::table('orders')->max('id')); 

// Using Eloquent 
$order = Orders::find(DB::table('orders')->max('id')); 

(Si noti che se il campo id non è univoco, si otterrà solo una fila indietro -. Questo è dovuto al fatto find() tornerà solo il primo risultato dal server SQL).

+0

è possibile farlo catena 'toArray()'? Ho ricevuto un errore se aggiungo con -> toArray(). – Shiro

+0

@Shiro 'toArray()' è un metodo di modello di Eloquent, non di DB. Dovrai invece usare 'whereRaw()'. Ho aggiornato la mia risposta. – timgws

+0

grazie per la tua risposta, posso sapere perché hai messo array (25) per questo? – Shiro

29

Proprio come il docs say

DB::table('orders')->max('id'); 
+0

Vorrei ottenere l'intero record, non solo l'ID max, e non voglio fare due domande. – Shiro

+1

Cosa c'è di sbagliato in questa query? – timgws

+0

@Shiro Ci scusiamo, dovrai eseguire una catena di query per questo, dato che il fluent query builder di laravel non permetterà che questo sia fatto come una singola stringa, buona fortuna – Ohgodwhy

2

Per gli oggetti è possibile nidificare le query:

DB::table('orders')->find(DB::table('orders')->max('id')); 

Quindi la query all'interno guarda in alto l'id max nella tabella e poi passa che al ritrovamento, che si ottiene indietro l'oggetto.

11

Non c'è bisogno di utilizzare sub interrogazione, basta provare questo, il suo bel lavoro:

DB::table('orders')->orderBy('id', 'desc')->first(); 
6
Orders::max('id'); 

ho usato è breve e migliore;

Problemi correlati