2013-12-13 12 views
156

Đây có thể là một câu hỏi tầm thường nhưng tôi tự hỏi nếu Laravel đề xuất một cách nhất định để kiểm tra xem một bộ sưu tập Eloquent trả về từ $result = Model::where(...)->get() có trống không, cũng như đếm số phần tử.Thu thập thông thường: đếm và phát hiện rỗng

Hiện tại chúng tôi đang sử dụng !$result để phát hiện kết quả trống, có đủ không? Đối với count($result), nó có thực sự bao gồm tất cả các trường hợp, kể cả kết quả rỗng không?

Trả lời

357

Khi sử dụng ->get() bạn có thể không chỉ đơn giản là sử dụng bất kỳ dưới đây:

if (empty($result)) { } 
if (!$result) { } 
if ($result) { } 

Bởi vì nếu bạn dd($result); bạn sẽ nhận thấy một thể hiện của Illuminate\Support\Collection luôn được trả về, ngay cả khi có không có kết quả. Về cơ bản những gì bạn đang kiểm tra là $a = new stdClass; if ($a) { ... } sẽ luôn trả về giá trị true.

Để xác định xem có bất kỳ kết quả mà bạn có thể làm bất cứ điều nào sau đây:

if ($result->first()) { } 
if (!$result->isEmpty()) { } 
if ($result->count()) { } 
if (count($result)) { } 

Bạn cũng có thể sử dụng ->first() thay vì ->get() trên xây dựng truy vấn mà sẽ trả về một thể hiện của mô hình tìm thấy đầu tiên, hoặc null nếu không. Điều này rất hữu ích nếu bạn cần hoặc chỉ mong đợi một kết quả từ cơ sở dữ liệu.

$result = Model::where(...)->first(); 
if ($result) { ... } 

Notes/Tài liệu tham khảo

Bonus Thông tin

Bộ sưu tập và sự khác biệt Query Builder có thể là một chút khó hiểu đối với người mới của Laravel vì tên phương thức thường giống nhau giữa hai tên. Vì lý do đó, có thể khó hiểu bạn đang làm gì. Trình tạo truy vấn về cơ bản tạo truy vấn cho đến khi bạn gọi một phương thức mà nó sẽ thực hiện truy vấn và nhấn vào cơ sở dữ liệu (ví dụ: khi bạn gọi một số phương thức nhất định như ->all()->first()->lists() và các phương thức khác). Các phương thức đó cũng tồn tại trên đối tượng Collection, có thể được trả về từ Trình tạo truy vấn nếu có nhiều kết quả.Nếu bạn không chắc chắn bạn đang làm việc với lớp nào, hãy thử thực hiện var_dump(User::all()) và thử nghiệm xem lớp nào thực sự trở lại (với sự trợ giúp của get_class(...)). Tôi khuyên bạn nên kiểm tra mã nguồn của lớp Collection, nó khá đơn giản. Sau đó, hãy xem Trình tạo truy vấn và xem các điểm tương đồng trong tên hàm và tìm hiểu khi nào nó thực sự truy cập cơ sở dữ liệu.

+4

thx, chỉ cần thêm rằng nếu bạn chạy truy vấn 'first()', kết quả khác với 'get()', có thể được kiểm tra bằng '! $ Result' là kết quả trống là' null' – bitinn

+2

@btinn yes - - nếu bạn đã làm ví dụ 'Model :: first()' - nó thực sự hành động trên phương thức 'first' của trình tạo truy vấn và NOT collection, do đó nó sẽ chọn cái đầu tiên từ cơ sở dữ liệu - tuy nhiên 'Model :: get() 'sẽ trả về một thể hiện của Illuminate \ Support \ Collection vì vậy nếu bạn đã làm' $ r = Model :: get() 'và sau đó' $ r-> first() 'nó sẽ chọn mục đầu tiên trong bộ sưu tập đó . –

+0

Một điều mà câu trả lời này không giải quyết là liệu các công thức 'đếm ($ result)' có hoạt động hay không; thêm chi tiết đó sẽ là một cải tiến. –

43

Tôi nghĩ rằng bạn đang tìm kiếm:

$result->isEmpty() 

Điều này khác với empty($result), mà sẽ không thể đúng vì kết quả sẽ là một bộ sưu tập trống. Đề xuất của bạn về count($result) cũng là một giải pháp tốt. Tôi không thể tìm thấy bất kỳ tài liệu tham khảo trong các tài liệu

+0

Liên kết bị hỏng. –

+0

Làm thế nào về khi bạn chỉ muốn kiểm tra xem một cột cụ thể (tài sản) như trong $ collection-> cột là rỗng/null hay không? – Pathros

0

nên Laravel thực sự trả về một bộ sưu tập khi chỉ sử dụng Model::all(); bạn không muốn có một bộ sưu tập bạn muốn một mảng, do đó bạn có thể gõ thiết lập nó. (array)Model::all(); sau đó bạn có thể sử dụng array_filter để trả lại kết quả

$models = (array)Model::all() 
$models = array_filter($models); 
if(empty($models)) 
{ 
do something 
} 

này cũng sẽ cho phép bạn làm những việc như count().

+3

giữ nó như là một bộ sưu tập thực sự thuận tiện để các đối tượng trả về vẫn có thể thừa kế rất nhiều chức năng hữu ích trong mặt tiền bộ sưu tập. – Gokigooooks

4

Tôi đồng ý với câu trả lời được chấp thuận ở trên. Nhưng thông thường tôi sử dụng phương pháp $results->isNotEmpty() như được đưa ra dưới đây.

if($results->isNotEmpty()) 
{ 
//do something 
} 

Nó dài hơn if(!results->isEmpty()) vì đôi khi chúng ta quên thêm '!' ở phía trước có thể dẫn đến lỗi không mong muốn.

Lưu ý rằng phương pháp này tồn tại từ phiên bản 5.3 trở đi.

1

Có nhiều phương pháp được đưa ra trong Laravel để kiểm tra kết quả đếm/check trống/không rỗng:

$result->isNotEmpty(); // True if result is not empty. 
$result->isEmpty(); // True if result is empty. 
$result->count(); // Return count of records in result. 
0

------ SOLVED ------

trong này trường hợp bạn muốn kiểm tra hai loại đếm cho hai CACE

trường hợp 1:

i kết quả f chỉ chứa một bản ghi từ khác chọn hàng duy nhất từ ​​cơ sở dữ liệu sử dụng -> đầu tiên()

if(count($result)){ 

     ...record is exist true... 
    } 

trường hợp 2:

nếu kết quả có chứa tập hợp nhiều hàng chữ khác sử dụng -> get() hoặc -> all()

if($result->count()) { 

     ...record is exist true... 
    } 
Các vấn đề liên quan