Eloquent: How to make lists() work for Accessor fields?

A very convenient way to populate dropdown options with Eloquent is to use lists() function. But it doesn’t work out of the box with “Append” fields, also called “Accessors”. Here’s a small trick to make it work.

First, how it works in a simple way:


$employees = Employee::where('branch_id', 9)->lists('name', 'id');
return view('customers.create', compact('employees'));


{!! Form::select('employee_id', $employees, '') !!}

And the result is a dropdown list with employees.
Now, what if in your database table employees you have fields “name”, “surname” and in Eloquent model you have append field full_name?

public function getFullNameAttribute() {
    return $this->name . ' ' . $this->surname;

And if you try to use the same lists(‘full_name’, ‘id’), it will fail with this error:

[2015-07-19 21:47:19] local.ERROR: exception 'PDOException' 
with message 'SQLSTATE[42S22]: Column not found: 
1054 Unknown column 'full_name' in 'field list'' in

The solution is to first get the results of the query, and only then to add lists() function, like this.

Instead of:

$employees = Employee::where('branch_id', 9)->lists('full_name', 'id');

You do:

$employees = Employee::where('branch_id', 9)->get()->lists('full_name', 'id');

And then you would have a proper dropdown, this time with full names.
See you in the next Laravel tip!

Like our articles?
Check out our Laravel online courses!



Please enter your comment!
Please enter your name here