Bộ sưu tập Eloquent: Đếm và phát hiện sản phẩm nào


272

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

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

Câu trả lời:


580

Khi sử dụng, ->get()bạn không thể sử dụng bất kỳ cách nào dưới đây:

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

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

Để xác định xem có bất kỳ kết quả nào không, bạn có thể thực hiện bất kỳ thao tác 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 trình xây dựng truy vấn sẽ trả về một thể hiện của mô hình được tìm thấy đầu tiên, hoặc nullnếu không. Điều này 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) { ... }

Ghi chú / Tài liệu tham khảo

Thông tin thưởng

Sự khác biệt của Bộ sưu tập và Trình tạo truy vấn có thể hơi khó hiểu với những người mới sử dụng 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 khi biết bạn đang làm việc trên cái gì. Trình tạo truy vấn về cơ bản xây dựng một truy vấn cho đến khi bạn gọi một phương thức trong đó nó sẽ thực thi truy vấn và truy cập 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 Collectionđối tượng, 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 mình đang thực sự 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ủaget_class(...)). Tôi thực sự khuyên bạn nên kiểm tra mã nguồn cho lớp Collection, nó khá đơn giản. Sau đó kiểm tra Trình tạo truy vấn và xem sự tương đồng trong tên hàm và tìm hiểu khi nào nó thực sự chạm vào 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 với !$resultkết quả trống lànull
bitinn

2
@btinn có - nếu bạn đã làm Model::first()- nghĩa là nó thực sự hoạt động theo phương thức 'đầu tiên' của trình tạo truy vấn và KHÔNG phải là bộ sưu tập, 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 phiên bản của Illuminate \ Support \ Bộ sưu tập vì vậy nếu bạn đã làm $r = Model::get()và sau đó $r->first()nó sẽ chọn ra mục đầu tiên trong bộ sưu tập đó.
Gary Green

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

sự khác biệt giữa $ result-> Count và Count ($ result) $ result-> Count có đánh lại cơ sở dữ liệu không? Nếu không, tôi đoán đây là giống nhau rồi!
Kamy D

2
@pathros Không có cách nào đơn giản để làm điều đó. Bạn sẽ phải lặp lại qua từng thành viên của bộ sưu tập bằng cách sử dụng một foreachvòng lặp và sau đó sử dụng một trong những kiểm tra này (think count($collection->column):).
PapaHotelPapa

70

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

$result->isEmpty()

Điều này khác với empty($result), điều này sẽ không đúng vì kết quả sẽ là một bộ sưu tập trống. Đề nghị của bạn 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


1
Sẽ thế nào khi bạn chỉ muốn kiểm tra xem một cột (thuộc tính) cụ thể như trong $ sưu tập-> cột có trống / null hay không?
Pathros

13

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

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

Nó dài dòng 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.


4

Có một số phương pháp được đưa ra trong Laravel để kiểm tra số lượng kết quả / kiểm tra trống / không trống:

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

4

Tôi nghĩ tốt hơn để sử dụng

$result->isEmpty();

Phương thức isEmpty trả về true nếu bộ sưu tập trống; mặt khác, sai được trả lại.


3

Tôi nghĩ bạn thử một cái gì đó như

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

hoặc cũng sử dụng

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

2

Bạn có thể làm

$result = Model::where(...)->count(); 

để đếm kết quả.

Bạn cũng có thể dùng

if ($result->isEmpty()){}

để kiểm tra xem kết quả có trống hay không.


1

Theo tài liệu của Laravel, bạn có thể sử dụng cách này:

$result->isEmpty();

Các isEmptyphương thức trả về truenếu bộ sưu tập là trống rỗng; nếu không, falseđược trả lại.


0

Vì vậy, 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 một bộ sưu tập bạn muốn một mảng để bạn có thể nhập bộ. (array)Model::all();sau đó bạn có thể sử dụng Array_filter để trả về kết quả

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

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


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

0

------ GIẢI QUYẾT ------

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

trường hợp 1:

nếu kết quả chỉ chứa một bản ghi từ khác, hãy chọn một hàng từ cơ sở dữ liệu bằng cách sử dụng -> first ()

 if(count($result)){

       ...record is exist true...
  }

trường hợp 2:

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

  if($result->count()) {

         ...record is exist true...
  }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.