Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Accessors and Mutators in Laravel

Introduction

In Laravel, Eloquent provides a simple way to interact with the database. One of the powerful features of Eloquent is the ability to define accessors and mutators on your models. Accessors allow you to format a model attribute when it is retrieved, while mutators allow you to modify a model attribute before it is saved to the database. This tutorial will guide you through the concepts of accessors and mutators with detailed explanations and examples.

What are Accessors?

Accessors are custom methods that format the value of a model's attribute when it is accessed. They allow you to manipulate the data before it is returned to the application. To define an accessor, you create a method named get{Name}Attribute in your model, where {Name} is the name of the attribute you want to access.

Example of an Accessor

Consider a User model with a first_name and last_name attributes. You may want to create a full name accessor.

class User extends Model
{
    protected $fillable = ['first_name', 'last_name'];

    public function getFullNameAttribute()
    {
        return "{$this->first_name} {$this->last_name}";
    }
}
                    

In this example, the getFullNameAttribute method concatenates the first_name and last_name attributes. You can now access the full name using $user->full_name.

$user = User::find(1);
echo $user->full_name; // Output: John Doe
                

What are Mutators?

Mutators allow you to modify the value of a model's attribute before it is saved to the database. To define a mutator, you create a method named set{Name}Attribute in your model, where {Name} is the name of the attribute you want to mutate.

Example of a Mutator

Continuing with the User model, you may want to ensure that the first_name is always stored in title case.

class User extends Model
{
    protected $fillable = ['first_name', 'last_name'];

    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = ucfirst(strtolower($value));
    }
}
                    

In this example, the setFirstNameAttribute method ensures that the first_name is always saved in title case. When you set the first_name attribute, it will automatically be formatted.

$user = new User();
$user->first_name = 'jOhn';
$user->last_name = 'Doe';
$user->save();

echo $user->first_name; // Output: John
                

Using Accessors and Mutators Together

You can take advantage of both accessors and mutators in your models to ensure data integrity and provide formatted output. For instance, using the previous User model, you can define both accessors and mutators for the first_name and last_name attributes.

Combined Example

Here’s how you might define both accessors and mutators:

class User extends Model
{
    protected $fillable = ['first_name', 'last_name'];

    public function getFullNameAttribute()
    {
        return "{$this->first_name} {$this->last_name}";
    }

    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = ucfirst(strtolower($value));
    }

    public function setLastNameAttribute($value)
    {
        $this->attributes['last_name'] = ucfirst(strtolower($value));
    }
}
                    

In this example, both the first_name and last_name attributes are mutated to title case before being saved, and the full name can be accessed through the accessor.

Conclusion

Accessors and mutators are powerful features in Laravel's Eloquent ORM that enhance the way you interact with your model attributes. By using accessors, you can format data when retrieving it, and with mutators, you can ensure data integrity before saving it to the database. By incorporating these techniques into your Laravel applications, you can create cleaner, more maintainable code.