Here we will see how we can add a new attribute in an eloquent model.
Sometimes When converting models to arrays or JSON,we require additional information based on some calculation/manipulation on columns of models, in that case we can easily add this new attribute in model using following steps provided by Laravel.
Suppose we have an user model and we want a full_name
attribute to be appended for the user. As first_name
and last_name
already exist in database as columns ,we can easily create fullname
as following:
1. Define Accessor :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Determine full name of user
*
* @return \Illuminate\Database\Eloquent\Casts\Attribute
*/
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
If we only define accessor we can refer user full_name
using following code
User::find(1)->full_name;
But here’s the thing – if you just return User object, it won’t contain full_name
:
dd(User::find(1)->toJSON());
The result would look something like this:
{
"id":1,
"first_name":"abc",
"last_name":"def",
"created_at":"2022-06-19 08:16:58",
"updated_at":"2022-06-19 19:48:09"
}
So here comes the next step :
2. Add attribute to Append property:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['full_name'];
}
Note that attribute names are typically referenced using their "snake case" (full_name
) serialized representation, even though the accessor's PHP method is defined using "camel case"(getFullNameAttribute
).
Once the attribute has been added to the appends
list, it will be included in both the model's array and JSON representations, like following :
{
"id":1,
"first_name":"abc",
"last_name":"def",
"created_at":"2022-06-19 08:16:58",
"updated_at":"2022-06-19 19:48:09",
"full_name":"abc def"
}