When working with Eloquent models in Laravel, you may have seen both of these approaches used to access model attributes:

PHP
$this->columnName
//or
$this->attributes['columnName']

Although they may seem identical, they behave differently under the hood. Understanding the difference is especially important when creating custom accessors, mutators, casts, and model attributes.

# Quick Answer

The main difference is $this->columnName passes through Laravel’s attribute system and applies casts, accessors, and other transformations while $this->attributes[‘columnName’] returns the raw value stored inside the model’s internal attributes array, without applying casts or accessors.

# Example

Consider the following model:

PHP
class User extends Model
{
    protected function casts(): array
    {
          return [ 'is_active' => 'boolean'];
  }
}

Assume the database contains is_active = 1 . Now compare the results:

$this->is_active will return true, while $this->attributes[‘is_active’] will return 1.

So when you are defining custom attributes, should be careful to which type you are using.

# Performance Consideration

Accessing $this->attributes[‘columnName’] is slightly faster because Laravel does not need to resolve casts, accessors, or attribute transformations. However, the performance difference is usually negligible, and readability and correctness should be prioritized.

# When should you use each one?

use $this->columnName when:

  • You want casts to be applied.
  • You need the value as Laravel presents it to the application.
  • You are working with dates, arrays, enums, or custom casts.

use $this->attributes[‘columnName’] when:

  • You need the raw database value.
  • You are implementing low-level attribute transformations.
  • You intentionally want to bypass casts.