2014-04-15 20 views
24

Jak to zrobić w Laravel 4.1 QUERY Builder?Laravel Query Builder gdzie max id

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

Próbowałem tego, działa, ale nie mogę uzyskać wymownej funkcji.

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

Czy masz pomysł na ulepszenie?

Odpowiedz

30

powinien być w stanie wykonać select na tabeli Zamówienia, przy użyciu surowego gdzie znaleźć max (id) w podzapytania, podobnie jak to:

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

Jeśli chcesz używać Eumquent (na przykład, aby przekonwertować swoją odpowiedź na obiekt), będziesz chciał użyć parametru whereRaw, ponieważ niektóre funkcje, takie jak toJSON lub toArray, nie będą działały bez używania modeli Eumquent.

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

To oczywiście wymaga posiadania modelu, który wydłuży Eumquent.

class Orders extends Eloquent {} 

Jak wspomniano w komentarzach, nie trzeba używać whereRaw można zrobić całą kwerendy przy użyciu kreator zapytań SQL bez surowego.

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

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

(Zauważ, że jeśli pole id nie jest wyjątkowa, dostaniesz jeden wiersz tylną tylko. - to dlatego find() powróci tylko pierwszy wynik z serwera SQL).

+0

jest możliwe, aby łańcuch 'toArray()'? Wystąpił błąd, jeśli dołączam -> toArray(). – Shiro

+0

@Shiro 'toArray()' jest modelową metodą Eloquent, a nie DB. Będziesz musiał zamiast tego użyć 'whereRaw()'. Zaktualizowałem swoją odpowiedź. – timgws

+0

dziękuję za odpowiedź, czy mogę wiedzieć, dlaczego umieściłeś tablicę (25)? – Shiro

29

Podobnie jak docs say

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

Chciałbym uzyskać cały rekord, nie tylko maksymalny identyfikator, i nie chcę, aby to dwa pytania. – Shiro

+1

Co jest nie tak z tym zapytaniem? – timgws

+0

@Shiro Przepraszamy, będziesz musiał wykonać łańcuch zapytań, ponieważ płynny konstruktor zapytań laravel nie pozwoli, aby to zostało wykonane jako pojedynczy ciąg, powodzenia – Ohgodwhy

2

Dla obiekty mogą zagnieździć wam wyszukiwania:

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

Więc zapytanie wewnątrz patrzy max id w tabeli, a następnie przekazuje, że do znalezienia, który dostaje z powrotem obiekt.

11

Nie trzeba używać kwerendy sub, po prostu spróbuj tego, jego działa poprawnie:

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

użyłem jest krótka i najlepiej;

Powiązane problemy