2014-04-15 18 views
24

Làm cách nào để thực hiện điều này trong Laravel 4.1 Trình xây dựng cơ sở dữ liệu?Trình tạo truy vấn Laravel trong đó id tối đa

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

Tôi đã thử tính năng này, hoạt động nhưng không thể có được tính năng hùng hồn.

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

Bất kỳ ý tưởng nào để làm cho nó tốt hơn?

Trả lời

30

Bạn sẽ có thể thực hiện một lựa chọn trên bảng lệnh, sử dụng một liệu WHERE để tìm ra max (id) trong một subquery, như thế này:

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

Nếu bạn muốn sử dụng hùng biện (ví dụ, vì vậy bạn có thể chuyển đổi phản ứng của bạn đến một đối tượng), bạn sẽ muốn sử dụng whereRaw, bởi vì một số chức năng như toJSON hoặc toArray sẽ không làm việc mà không sử dụng mô hình hùng hồn.

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

Điều đó, tất nhiên, yêu cầu bạn phải có mô hình mở rộng Eloquent.

class Orders extends Eloquent {} 

Như đã đề cập trong các ý kiến, bạn không cần phải sử dụng whereRaw, bạn có thể làm toàn bộ truy vấn bằng cách sử dụng xây dựng truy vấn mà không SQL thô.

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

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

(Lưu ý rằng nếu trường id không phải là độc đáo, bạn sẽ chỉ nhận được một hàng lại -. Điều này là do find() sẽ chỉ trả lại kết quả đầu tiên từ máy chủ SQL).

+0

nó có thể làm cho nó chuỗi 'toArray()'? Tôi gặp lỗi nếu tôi nối thêm với -> toArray(). – Shiro

+0

@Shiro 'toArray()' là một phương thức mô hình của Eloquent, không phải của DB. Thay vào đó, bạn sẽ cần sử dụng 'whereRaw()'. Tôi đã cập nhật câu trả lời của mình. – timgws

+0

cảm ơn câu trả lời của bạn, tôi có thể biết tại sao bạn đặt mảng (25) cho nó? – Shiro

29

Cũng giống như các docs say

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

Tôi muốn nhận toàn bộ hồ sơ, không chỉ là id tối đa và tôi không muốn đặt làm hai truy vấn. – Shiro

+1

Điều gì là sai với truy vấn này? – timgws

+0

@Shiro Xin lỗi, bạn sẽ phải thực hiện một chuỗi truy vấn cho điều này, vì trình xây dựng truy vấn thông thạo của Laravel sẽ không cho phép điều này được thực hiện như một chuỗi duy nhất, chúc may mắn – Ohgodwhy

2

Đối với đối tượng mà bạn có thể làm tổ các truy vấn:

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

Vì vậy, các truy vấn bên trong nhìn lên id max trong bảng và sau đó đi đến phát hiện này, mà giúp bạn trở lại đối tượng.

11

Không cần phải sử dụng truy vấn phụ, chỉ cần Hãy thử điều này, nó làm việc tốt:

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

tôi đã sử dụng nó là ngắn nhất và tốt nhất;

Các vấn đề liên quan