How to concatenate columns with Laravel 4 Eloquent?
Question
I have a table called tenantdetails
which contains
Tenant_Id | First_Name | Last_Name | ........
and I want to retrieve First_Name
and Last Name
as one column via the concatenation function of MySQL. So I write in my controller
as follows
$tenants = Tenant::orderBy('First_Name')->lists('CONCAT(`First_Name`," ",`Last_Name`)','Tenant_Id');
But results the following error:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`," ",`First_Name`)`, `Id` from `tenantdetails` order by `F' at line 1 (SQL: select `CONCAT(`First_Name`," ",`Last_Name`)`, `Id` from `tenantdetails` order by `First_Name` asc).
How can we avoid the backticks while calling a function of MySQL in Laravel Eloquent. I am interested only in Eloquent (not in fluent query). Thanks in advance.
Update
Thanks to @Andreyco for helping me. We can achieve this in a more elegant way using Laravel models, as below:
In our model
:
public function getTenantFullNameAttribute()
{
return $this->attributes['First_Name'] .' '. $this->attributes['Last_Name'];
}
and in our controller
:
$tenants = Tenant::orderBy('First_Name')->get();
$tenants = $tenants->lists('TenantFullName', 'Tenant_Id');
Solution
Tenant::select('Tenant_Id', DB::raw('CONCAT(First_Name, " ", Last_Name) AS full_name'))
->orderBy('First_Name')
->lists('full_name', 'Tenant_Id');
OTHER TIPS
An easy way is to use selectRaw
. It was implemented by Tailor in Jan 30, 2014
Tenant::selectRaw('CONCAT(First_Name, " ", Last_Name) as TenantFullName, id')->orderBy('First_Name')->lists('TenantFullName', 'id'))
lists() method used to select column from selected result. So first contact first name and last name and give this column with new alias name in select statement
$tenants = Tenant::orderBy('First_Name')->select(DB::row('CONCAT(`First_Name`," ",`Last_Name`) as name'),'Tenant_Id')->lists('name', 'id');
then you can select this alias in lists() method
You should use the DB::raw() to concat those of field
Tenant::select(
'Tenant_Id',
DB::raw('CONCAT(First_Name,"-",Last_Name) as full_name')
)
->orderBy('First_Name')
->lists('full_name', 'Tenant_Id');