Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eloquent Collection: Counting and Detect Empty

This may be a trivial question but I am wondering if Laravel recommends a certain way to check whether an Eloquent collection returned from $result = Model::where(...)->get() is empty, as well as counting the number of elements.

We are currently using !$result to detect empty result, is that sufficient? As for count($result), does it actually cover all cases, including empty result?

like image 649
bitinn Avatar asked Dec 13 '13 09:12

bitinn


People also ask

How do you check if a variable is empty in laravel?

Assumption #1: You Know The Variable Exists Within The View. REMEMBER: an empty array will always return false. Therefore, there is no real need to run it through a function like empty or is null. Comparing it to null will tell you if it exists or not.

How to count number of rows in laravel?

In laravel eloquent or query builder we use count method to count the rows. We can also count rows after executing the query using get() or all() and then can apply collection count method.


2 Answers

When using ->get() you cannot simply use any of the below:

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

Because if you dd($result); you'll notice an instance of Illuminate\Support\Collection is always returned, even when there are no results. Essentially what you're checking is $a = new stdClass; if ($a) { ... } which will always return true.

To determine if there are any results you can do any of the following:

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

You could also use ->first() instead of ->get() on the query builder which will return an instance of the first found model, or null otherwise. This is useful if you need or are expecting only one result from the database.

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

Notes / References

  • ->first() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_first
  • isEmpty() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_isEmpty
  • ->count() http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count
  • count($result) works because the Collection implements Countable and an internal count() method: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count

Bonus Information

The Collection and the Query Builder differences can be a bit confusing to newcomers of Laravel because the method names are often the same between the two. For that reason it can be confusing to know what one you’re working on. The Query Builder essentially builds a query until you call a method where it will execute the query and hit the database (e.g. when you call certain methods like ->all() ->first() ->lists() and others). Those methods also exist on the Collection object, which can get returned from the Query Builder if there are multiple results. If you're not sure what class you're actually working with, try doing var_dump(User::all()) and experimenting to see what classes it's actually returning (with help of get_class(...)). I highly recommend you check out the source code for the Collection class, it's pretty simple. Then check out the Query Builder and see the similarities in function names and find out when it actually hits the database.

  • Laravel 5.2 Collection Class
  • Laravel 5.2 Query Builder
like image 104
Gary Green Avatar answered Sep 25 '22 23:09

Gary Green


I think you are looking for:

$result->isEmpty() 

This is different from empty($result), which will not be true because the result will be an empty collection. Your suggestion of count($result) is also a good solution. I cannot find any reference in the docs

like image 40
clod986 Avatar answered Sep 25 '22 23:09

clod986