We will learn how to use mutator and accessor in Laravel 9. Within examples accessor you will understand what is accessor in Laravel 9 and mutator. The following example below will help you when to use eloquent mutator and accessor in Laravel.
In Laravel 9 is quite different a little from early Laravel version. Mutator and Accessor in other word is like brothers, with more understand I will give simple definition what is Accessors and Mutators in Laravel Eloquent.
Accessor is user custom attribute on model class which we can access as attribute or database column, basically use to retrieve from database. In C# we may call this as Getter.
Mutator is user custom attribute on model class which we can set the format or custom data before insert into the database. In C# we may call this as Setter.
I will explain with simple example, in User Model class have new field call "bio" we will give input format string in random letter case sometimes and when we want to retrieved the field back with lower case letter you may do this logic again and again in many places (Imagine If You Have Complicated logic and need Write Again and Again, This Is Not a Best Practice).
So, let's see below example and you will got it how it works.
The following steps help you to understand how to use accessors and mutators in Laravel 9 :
You have to installed Laravel framework but not required if you already done. Read this to know how to install Laravel project.
We are going to update a field name bio for user table, so let's update as code below:
Open file database -> migrations -> 2022_07_22_564781_create_users_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->string('bio');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
};
After that run command below to migrate table into database.
php artisan migrate
Basically, accessor and muatator are created in model class by extend from Attirube Class.
Open file app -> Models -> User.php
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Carbon\Carbon;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'email',
'password',
'bio'
];
/**
* The attributes that should be hidden for serialization.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* Interact with the user's first name.
*
* @param string $value
* @return \Illuminate\Database\Eloquent\Casts\Attribute
*/
protected function bio(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => strtolower($value),
);
}
}
Now, we are going to create a new UserController and we will create two new methods store() and show() by following command to generate controller file:
php artisan make:controller UserController
Open file app -> Http -> Controllers -> UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
public function store()
{
$user = [
'name' => 'cambo tutorial',
'email' => 'cambo@tutorial.com',
'password' => bcrypt('123456'),
'bio' => 'This Document Should Be Unique And Personal. In The Same Vein'
];
$data= User::create($user);
dd($data);
}
public function show()
{
$user = User::all();
dd($user->toArray());
}
}
This step, you have mapping route controller and URL by following routes in the routes/web.php file.
Open file routes -> web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('\store', [UserController::class,'create']);
Route::get('\show', [UserController::class,'show']);
Now we are going to start Laravel server by following command and see the result.
php artisan serve
Output Mutator go to link http://localhost:8000/store
It will create user and check the bio column the text is lowercase.
Output Accessor go to link http://localhost:8000/show
The data return from column bio is convert to uppercase
array:7 [
"id" => 1
"name" => "Cambo Tutorial"
"email" => "cambo@tutorial.com"
"email_verified_at" => null
"created_at" => "2022-06-27T04:37:46.000000Z"
"updated_at" => "2022-06-27T04:37:46.000000Z"
"bio" => "THIS DOCUMENT SHOULD BE UNIQUE AND PERSONAL. IN THE SAME VEIN"
]
I hope this article helped you to learn about Eloquent Mutators and Accessors in Laravel 9. Please have a nice day!
You might also like...
Laravel PHP Laravel 9
Founder of CamboTutorial.com, I am happy to share my knowledge related to programming that can help other people. I love write tutorial related to PHP, Laravel, Python, Java, Android Developement, all published post are make simple and easy to understand for beginner. Follow him