Laravel Accessors And Mutators
Tags: php, laravel, webdev, tutorial
Published: 2021-11-02 08:12:55

**Hello** artisans how's everything going? Working with Laravel Eloquent ORM we often need to change or format the behavior of data. Accessors and Mutators simply changed the format or the behavior of the data while retrieving and storing. We'll see simple examples to understand these concepts easily

###Table Of Contents
>1. [Setup Project & Model](#spm)
>2. [Accessors](#aceessor)
>3. [Mutators](#mutator)
>4. [Database Seeder](#dbseeder)
>5. [Route & Controller](#routecontroller)
>6. [Overview](#overview)


<h3><a name="spm" href="#spm" class="anchor"></a>
  Setup Project & Model
</h3>

To start the example we need to install and set up the model and database connection first. I'm using phpMyAdmin (MySQL database).

To create a fresh Laravel application run this command in terminal

```php
composer create-project laravel/laravel demoapp
```
now we have a fresh Laravel application. I already created a database in `PHPMyAdmin` now go in the `.env` file to set the database connection 

```php
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=demoapp
DB_USERNAME=root
DB_PASSWORD=
```

<h3><a name="aceessor" href="#aceessor" class="anchor"></a>
  Accessors
</h3>

Accessors is a get attribute in Laravel when getting data in a changed or dummy formatted attribute we use an accessor. Suppose we have `User` model with data table columns with `first_name` & `last_name`.

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('phone_code');
            $table->string('phone_number');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```

Now we want a `full_name` attribute to concatenate both `first_name` and `last_name` to get `full_name`. let's see an example for a clear understanding


Go to the `app\Models\Users.php`file and write the Assessor method 

>**Syntext For Accessors** 

```php
protected $fillable = [
        'name',
        'phone_code',
        'phone_number',
        'email',
        'password',
    ];

// Accessor Method
public function getPhoneAttribute() {
     return $this->phone_code . "-" . $this->phone_number;
}
```


<h3><a name="mutator" href="#mutator" class="anchor"></a>
  Mutators
</h3>

Mutator is a setter value attribute that transforms an Eloquent attribute value when it is set into the database. To get an example lets again go back to `app\Models\Users.php` to write a mutator method 

>**Syntext For Mutators** 

```php
// Mutator Method
public function setNameAttribute($value)
{
   return $this->attributes['name'] = ucfirst($value);
}
```

We are trying to convert the first character of a name string to uppercase that's why using the `ucfirst()` function to transform the data while storing.


<h3><a name="dbseeder" href="#dbseeder" class="anchor"></a>
  Database Seeder
</h3>

To test our methods we need to have some data in our database. Using seeder to create data for example

In the `database/factories/UserFactory.php` file write this factory seeder

```php
public function definition()
    {
       return [
           'name' => $this->faker->name(),
           // this will create 3 digit random numbers
           'phone_code' => $this->faker->numerify('###'),
           // this will create 10 digit random numbers
           'phone_number' => $this->faker->numerify('##########'),
           'email' => $this->faker->unique()->safeEmail(),
           'email_verified_at' => now(),
           'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
           'remember_token' => Str::random(10),
       ];
   }
```
Now need to add this in `database/factories/DatabaseSeeders.php` 

```php
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        \App\Models\User::factory(10)->create();
    }
}
```

<h3><a name="routecontroller" href="#routecontroller" class="anchor"></a>
  Route & Controller
</h3>

In the `web.php` route file add this route to view the `welcome` page

```html
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Controller;


Route::get('/',[Controller::class,'index']);
```

In `app/Http/Controllers/Controller.php` write this function

```php
public function index()
    {
        $data = User::all();
        return view('welcome')->with('data',$data);
    }
```
This function will fetch all the data from the `User` Model in `welcome.blade.php`

>**Blade File**

```php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Demo App</title>
        <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="card shadow p-3 mb-5 mt-5 bg-white rounded mx-auto">
                    <div class="">
                        <table class="table table-striped table-dark">
                            <thead>
                              <tr>
                                <th scope="col">#</th>
                                <th scope="col">Name</th>
                                <th scope="col">Phone</th>
                              </tr>
                            </thead>
                            <tbody>
                                @foreach ($data as $d)
                              <tr>
                                <td>{{ $loop->iteration }}</td>
                                <td>{{ $d->name }}</td>
                                <td>{{ $d->phone }}</td>
                              </tr>
                              @endforeach
                            </tbody>
                          </table>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>
``` 

<h3><a name="overview" href="#overview" class="anchor"></a>
 Overview
</h3>

![Final Output](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vx08x4xakmv4jxf68kzf.png)

This is our `welcome.blade.php` file where we can see data formations are changed according to the `User.php` model Accessors and Mutators methods. we are getting the `phone_code` and `phone_number` into `phone` attribute call. also, we are getting the `names` in formatted order.

>Thats all stay tuned