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
Setup Project & Model
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
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
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=demoapp
DB_USERNAME=root
DB_PASSWORD=
Accessors
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
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.phpfile and write the Assessor method
Syntext For Accessors
protected $fillable = [
'name',
'phone_code',
'phone_number',
'email',
'password',
];
// Accessor Method
public function getPhoneAttribute() {
return $this->phone_code . "-" . $this->phone_number;
}
Mutators
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
// 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.
Database Seeder
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
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
class DatabaseSeeder extends Seeder
{
public function run()
{
\App\Models\User::factory(10)->create();
}
}
Route & Controller
In the web.php route file add this route to view the welcome page
<?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
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
<!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>
Overview
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

Top comments (0)