Bird
Raised Fist0
Laravelframework~5 mins

Accessors and mutators in Laravel

Choose your learning style10 modes available
Introduction

Accessors and mutators let you change how data is read from or saved to your database in Laravel models. They help keep your code clean and consistent.

You want to format a date before showing it to users.
You need to automatically encrypt a password before saving it.
You want to change how a name is stored or displayed, like always capitalizing it.
You want to add a prefix or suffix to a value when reading it.
You want to convert stored data into a different type when accessing it.
Syntax
Laravel
class User extends Model {
    // Accessor
    public function getAttributeNameAttribute($value) {
        return ucfirst($value);
    }

    // Mutator
    public function setAttributeNameAttribute($value) {
        $this->attributes['attribute_name'] = strtolower($value);
    }
}

Accessor methods start with get, end with Attribute, and receive the original value.

Mutator methods start with set, end with Attribute, and receive the new value to store.

Examples
This accessor creates a new full_name attribute by joining first and last names.
Laravel
public function getFullNameAttribute() {
    return $this->first_name . ' ' . $this->last_name;
}
This mutator automatically encrypts the password before saving it.
Laravel
public function setPasswordAttribute($value) {
    $this->attributes['password'] = bcrypt($value);
}
This accessor formats the created_at date when accessed.
Laravel
public function getCreatedAtAttribute($value) {
    return date('d-m-Y', strtotime($value));
}
Sample Program

This example shows a User model with an accessor and mutator for the name attribute. When setting the name, it saves in lowercase. When getting the name, it returns with the first letter capitalized.

Laravel
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Accessor to capitalize the name when accessed
    public function getNameAttribute($value)
    {
        return ucfirst($value);
    }

    // Mutator to store the name in lowercase
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtolower($value);
    }
}

// Usage example
$user = new User();
$user->name = 'ALICE'; // Mutator converts to 'alice'
echo $user->name; // Accessor converts to 'Alice'
OutputSuccess
Important Notes

Accessors and mutators only work on model attributes, not on regular methods.

Make sure method names exactly follow the getXAttribute and setXAttribute pattern, where X is the attribute name in StudlyCase.

Use accessors to format or modify data when reading, and mutators to change data before saving.

Summary

Accessors change how you get data from a model attribute.

Mutators change how you set data on a model attribute.

They help keep your data consistent and your code clean.

Practice

(1/5)
1. What is the main purpose of an accessor in a Laravel model?
easy
A. To modify the value when saving a model attribute
B. To validate model data before saving
C. To define relationships between models
D. To modify the value when retrieving a model attribute

Solution

  1. Step 1: Understand what an accessor does

    An accessor changes how you get or read a model attribute's value.
  2. Step 2: Differentiate from mutator

    A mutator changes the value when setting or saving, not getting.
  3. Final Answer:

    To modify the value when retrieving a model attribute -> Option D
  4. Quick Check:

    Accessor = get attribute value [OK]
Hint: Accessor modifies data on get, mutator on set [OK]
Common Mistakes:
  • Confusing accessor with mutator
  • Thinking accessor validates data
  • Mixing up relationships with accessors
2. Which of the following is the correct way to define an accessor for the name attribute in a Laravel model?
easy
A. public function name() { return $this->attributes['name']; }
B. public function setNameAttribute($value) { $this->attributes['name'] = strtolower($value); }
C. public function getNameAttribute($value) { return strtoupper($value); }
D. public function get_name() { return $this->name; }

Solution

  1. Step 1: Recall accessor naming convention

    Accessors use the format get{Attribute}Attribute with the attribute name capitalized.
  2. Step 2: Check method signature and return

    The method receives the raw value and returns the modified value.
  3. Final Answer:

    public function getNameAttribute($value) { return strtoupper($value); } -> Option C
  4. Quick Check:

    Accessor method = getNameAttribute [OK]
Hint: Accessor method name starts with get and ends with Attribute [OK]
Common Mistakes:
  • Using set prefix for accessor
  • Wrong method naming like get_name
  • Not returning a value
3. Given the following Laravel model code, what will $user->full_name output?
class User extends Model {
  public function getFullNameAttribute() {
    return $this->first_name . ' ' . $this->last_name;
  }
}
$user = new User();
$user->first_name = 'Jane';
$user->last_name = 'Doe';
echo $user->full_name;
medium
A. JaneDoe
B. Jane Doe
C. Error: Undefined property full_name
D. null

Solution

  1. Step 1: Understand the accessor method

    The method getFullNameAttribute concatenates first_name and last_name with a space.
  2. Step 2: Check assigned values and output

    first_name is 'Jane', last_name is 'Doe', so full_name returns 'Jane Doe'.
  3. Final Answer:

    Jane Doe -> Option B
  4. Quick Check:

    Accessor combines names with space [OK]
Hint: Accessor returns combined attributes as expected [OK]
Common Mistakes:
  • Forgetting space between names
  • Expecting property to exist without accessor
  • Confusing method name with property
4. Identify the error in this mutator method for the email attribute:
public function setEmailAttribute($email) {
  $this->email = strtolower($email);
}
medium
A. Should assign to $this->attributes['email'], not $this->email
B. Method name should be getEmailAttribute
C. Missing return statement
D. Mutators cannot modify email attribute

Solution

  1. Step 1: Check mutator assignment syntax

    Mutators must assign to $this->attributes['attribute'], not directly to $this->attribute.
  2. Step 2: Confirm method name and behavior

    Method name setEmailAttribute is correct; no return needed.
  3. Final Answer:

    Should assign to $this->attributes['email'], not $this->email -> Option A
  4. Quick Check:

    Mutator assigns to attributes array [OK]
Hint: Mutators assign to attributes array, not direct property [OK]
Common Mistakes:
  • Assigning directly to $this->property
  • Using accessor naming for mutator
  • Expecting return value in mutator
5. You want to store a user's phone number in a Laravel model, but always save it without spaces or dashes. Which mutator method correctly achieves this?
public function setPhoneNumberAttribute($value) {
  // Remove spaces and dashes
  $clean = str_replace([' ', '-'], '', $value);
  // Save cleaned number
  ???
}
hard
A. $this->attributes['phone_number'] = $clean;
B. $this->phone_number = $clean;
C. return $clean;
D. $this->setAttribute('phone_number', $value);

Solution

  1. Step 1: Understand mutator assignment

    Mutators must assign cleaned value to $this->attributes['phone_number'] to save properly.
  2. Step 2: Check other options

    Assigning to $this->phone_number is incorrect; returning value or calling setAttribute with original value won't clean data.
  3. Final Answer:

    $this->attributes['phone_number'] = $clean; -> Option A
  4. Quick Check:

    Mutator saves cleaned value to attributes array [OK]
Hint: Mutator cleans input and assigns to attributes array [OK]
Common Mistakes:
  • Assigning directly to property instead of attributes
  • Returning value instead of assigning
  • Using original value instead of cleaned
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard