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.php
file 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)