bookmark_borderDefensive Programming | Laravel find()

  • Defensive Programming

One of the things I’ve learned in my career is to code defensively.

Laravel makes it very easy to ask for an object, but it also makes it very easy to get it wrong. If you request an object using the find method and it doesn’t find it, you don’t get an error. You get a null. If you then request a property on that object, without first checking for a null, you will get a run-time error.

This is pretty basic stuff, but it never hurts to go over it again.


$name = Widget::find(23)->name;




if ($widget = Widget::find(23)) { $name = $widget->name; }



The first block will throw an error if Widget #23 doesn’t exist in the database. The second checks for it’s existence and then only reaches for the name if it found it.



Are you also a PHP programmer? I’ve got other blog entries that you might be interested in!


More about me

I have been programming for almost 20 years. It all started with Basic and RPG III way back in high school, and have played around with many languages. PHP is my main language today.

Meet my Basenji dogs Zinga and Zulu:

bookmark_borderLaravel – the difference between all() and get()

When dealing with a model, all()  is a static method.
It creates a new query object, and runs get()  on that object

get()  is not static, but can be called statically because of a magic method in the Model class.

You cannot modify the query when using all() .

Model::all() // will retrieve all models


You can select columns to retrieve from the database by passing them as parameters to all()

Model::all('id') // will retrieve all models, but include only the id column


Model::all()  and Model::get()  do exactly the same thing. The only difference is that Model::all()  will create a query builder instance and call get() for you. It does this in a static method on the object.

If you call Model::get() , the magic method will create a query builder instance and call get()  on that instance.

Model::all()  will only accept columns as parameters. It is flexible and will accept either an array or a list of them.

Model::get()  will also only accept columns as parameters. However, it is not flexible, so you must provide them in an array.



This only works because of the magic method. Just like get() , where()  is not defined in the Model class.

Just remember that you’re dealing with a query builder instance.

bookmark_borderLaravel Eloquent only()

$fullModel = Model::find(1) // Get model with id 1
$idArray = $fullModel->only('id')  // array containing id

// this does not work. You'll get back an empty collection
// It is trying to pull the id column off the collection object,
// not the models it contains
$models = Model::all()
$ids = $models->only('id')

// this will give you a collection of ids
$models = Model::all()
$ids = $models->pluck('id')