# Fluent ORM: Mutators
## Introduction
Accessors and mutators allow you to format Fluent ORM attribute values when you retrieve or set them on model instances.
## Accessors & Mutators
### Defining An Accessor
To define an accessor, create a `getFirstNameAttribute` method on your model where Foo is the "studly" cased name of the column you wish to access. In this example, we'll define an accessor for the `first_name` attribute. The accessor will automatically be called by Fluent ORM when attempting to retrieve the value of the `first_name` attribute:
```php
first_name;
```
Of course, you may also use accessors to return new, computed values from existing attributes:
```php
/**
* Get the user's full name.
*
* @return string
*/
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
```
### Defining A Mutator
To define a mutator, define a `setFirstNameAttribute` method on your model where Foo is the "studly" cased name of the column you wish to access. So, again, let's define a mutator for the `first_name` attribute. This mutator will be automatically called when we attempt to set the value of the `first_name` attribute on the model:
```php
attributes['first_name'] = strtolower($value);
}
}
```
The mutator will receive the value that is being set on the attribute, allowing you to manipulate the value and set the manipulated value on the Fluent ORM model's internal `$attributes` property. So, for example, if we attempt to set the `first_name` attribute to Foo:
```php
$user = FluentCrm\App\Models\User::find(1);
$user->first_name = 'Foo';
```
In this example, the `setFirstNameAttribute` function will be called with the value `Foo`. The mutator will then apply the `strtolower` function to the name and set its resulting value in the internal `$attributes` `array`.
### Date Mutators
By default, Fluent ORM will convert the `created_at` and `updated_at` columns to instances of `DateTime`, which provide an assortment of helpful methods. You may customize which dates are automatically mutated, and even completely disable this mutation, by overriding the `$dates` property of your model:
```php
deleted_at = now();
$user->save();
```
As noted above, when retrieving attributes that are listed in your `$dates` property, they will automatically be cast to `DateTime` instances, allowing you to use any of `DateTime`'s methods on your attributes:
```php
$user = FluentCrm\App\Models\User::find(1);
return $user->deleted_at->getTimestamp();
```
### Date Formats
By default, timestamps are formatted as `Y-m-d H:i:s`. If you need to customize the timestamp format, set the `$dateFormat` property on your model. This property determines how date attributes are stored in the database, as well as their format when the model is serialized to an array or JSON:
```php
'boolean',
];
}
```
Now the `is_admin` attribute will always be cast to a boolean when you access it, even if the underlying value is stored in the database as an integer:
```php
$user = FluentCrm\App\Models\User::find(1);
if ($user->is_admin) {
//
}
```
## Array & JSON Casting
The `array` cast type is particularly useful when working with columns that are stored as serialized JSON. For example, if your database has a JSON or TEXT field type that contains serialized JSON, adding the array cast to that attribute will automatically deserialize the attribute to a PHP array when you access it on your Eloquent model:
```php
'array',
];
}
```
Once the cast is defined, you may access the `options` attribute and it will automatically be deserialized from JSON into a PHP array. When you set the value of the `options` attribute, the given array will automatically be serialized back into JSON for storage:
```php
$user = FluentCrm\App\Models\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();
```
## Date Casting
When using the `date` or `datetime` cast type, you may specify the date's format.
```php
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'created_at' => 'datetime:Y-m-d',
];
```