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.
Nguồn
2013-12-14 16:22:04
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
@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 đó . –
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. –