How to concatenate columns with Laravel 4 Eloquent?
Stefan Bogdanescu
Founder & Senior Architect · 2026-06-29
# How to Concatenate Columns with Laravel Eloquent: The Elegant Solution
As developers working with Laravel and Eloquent, we often need to manipulate data retrieved from the database before it is presented to the user. A common task is combining multiple columnsâlike first name and last nameâinto a single, readable field. While this seems like a simple operation, attempting to force raw MySQL functions directly into Eloquent query methods can lead to syntax errors and brittle code.
This post will walk you through why the direct approach fails and demonstrate the superior, idiomatic Laravel solution using Model Accessors, which keeps your data logic neatly encapsulated within your application layer.
### The Pitfall of Raw SQL in Eloquent Queries
Letâs look at the initial attempt often seen when developers try to use database functions directly within query builders:
Suppose you have a `tenantdetails` table with `First_Name` and `Last_Name`, and you want to retrieve a concatenated full name. You might try something like this in your controller:
```php
$tenants = Tenant::orderBy('First_Name')->lists('CONCAT(`First_Name`, ' ', `Last_Name`)', 'Tenant_Id');
```
As the error clearly demonstrates, trying to embed raw SQL functions inside Eloquent methods like `lists()` forces Laravel to handle the string construction, often resulting in incorrect quoting or syntax errors when dealing with backticks and specific MySQL syntax. The database engine expects a standard column selection, not arbitrary function calls injected this way. This approach violates the principle of separation of concernsâthe query builder should focus on *what* data to fetch, not *how* that data should be calculated.
### The Eloquent Way: Using Accessors for Calculated Attributes
The most robust and elegant solution in Laravel is to handle this data transformation directly within the Eloquent Model itself, using **Accessors** (or Mutators). This approach leverages the object-oriented nature of Eloquent, ensuring that any time you access a property, it automatically returns the desired calculated value. This aligns perfectly with best practices taught by the Laravel community, emphasizing clean, maintainable code.
#### Step 1: Define the Accessor in the Model
In your `Tenant` model, you define a method that Eloquent will recognize as an attribute accessor.
```php
// app/Models/Tenant.php
use Illuminate\Database\Eloquent\Casts\Attribute; // For Laravel 9+ using Attributes
// Or use the older method for broader compatibility:
// use Illuminate\Database\Eloquent\Casts\Attribute;
class Tenant extends Model
{
// Using the standard dynamic attribute approach (Laravel 10+)
protected function fullName(): Attribute
{
return new Attribute(
get: fn ($value, $attributes) => $attributes['First_Name'] . ' ' . $attributes['Last_Name']
);
}
// Alternatively, using the older Accessor syntax (if you prefer):
/*
public function getTenantFullNameAttribute()
{
return $this->First_Name . ' ' . $this->Last_Name;
}
*/
}
```
By defining this accessor, you have effectively created a new virtual column named `full_name` (or whatever you name it, depending on your implementation)