Tutorial Inertia Roles & Permissions - #5 - Membuat Model, Migration, Faker Dan Seeder Laravel

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah model, migration, faker dan seeder yang akan kita gunakan di dalam project kita.

Rafi Taufiqurrahman
Dipublish 13/07/2024

Pendahuluan

Setelah berhasil melakukan installasi laravel spatie, disini kita akan lanjutkan untuk pembuatan model, migration, factory dan seeder terlebih dahulu, silahkan teman - teman ikuti beberapa langkah dibawah ini.

Model & Migration Post

Silahkan teman - teman buka terminal-nya, kemudian jalankan perintah berikut ini :

Terminal
php artisan make:model Post -m

Jika perintah diatas berhasil dijalankan, maka kita akan dibuatkan sebuah model baru dengan nama Post. Kemudian, kita tambahkan flag -m, yang artinya kita juga akan membuat sebuah file baru sesuai dengan nama modelnya yaitu post akan tetapi nama migration-nya akan otomatis dibuatkan dalam bentuk plural.

Jika teman - teman perhatikan setelah menjalankan perintah diatas, kita akan mendapatkan 2 buah file baru yang terletak di :

  1. app/Models/Post.php
  2. database/migration/2024_07_09_164110_create_posts_table.php

Informasi : untuk nama file migration akan digenerate berdasarkan tanggal pembuatannya.

Selanjutnya kita akan menambahkan beberapa attribute baru didalam file migration posts, silahkan teman - teman buka filenya kemudian ubah kodenya menjadi seperti berikut ini :

2024_07_09_164110_create_posts_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.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Dari perubahan kode diatas, kita menambahan beberapa attribute baru didalam function up, kurang lebih penjelasannya seperti berikut ini :

ATTRIBUTE TYPE DATA
user_id foreignId
title string
content string

Pada kode diatas, kita juga menambahkan sebuah kolom relasi dari tabel posts ke tabel users.

Post.php
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();

Kode diatas artinya attribute user_id merupakan foreign key dari table users attribute id.

Setelah berhasil menambahkan beberapa attribute di dalam file migration, maka sekarang kita lanjutkan untuk menambahkaan mass assigment di dalam file model, tujuannya agar attribute yang sudah kita tambahkan diatas dapat melakukan manipulasi data, seperti proses insert, update dan delete.

Silahkan teman - teman buka file app/Models/Post.php, kemudian masukan kode berikut ini :

Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['user_id', 'title', 'content'];
}

Dari perubahan kode di atas, kita menambahkan properti baru dengan nama $fillable, dimana berisi attribute yang sudah kita buat sebelumnya di dalam migration posts.

Seeder Permission

Setelah berhasil membuat model dan migration, kita akan lanjutkan untuk membuat sebuah file seeder, Silahkan teman - teman buka terminalnya kemudian jalankan perintah berikut ini.

Terminal
php artisan make:seeder PermissionTableSeeder

Selanjutnya silahkan teman - teman buka file tersebut yang terletak di app/database/seeders, kemudian tambahkan kode berikut ini.

PermissionTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class PermissionTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        collect([
            'dashboard-access', 'dashboard-data',
            'permissions-access', 'permissions-data', 'permissions-create', 'permissions-update', 'permissions-delete',
            'roles-access', 'roles-data', 'roles-create', 'roles-update', 'roles-delete',
            'users-access', 'users-data', 'users-create', 'users-update', 'users-delete',
            'posts-access', 'posts-data', 'posts-create', 'posts-update', 'posts-delete',
        ])->each(fn($item) => Permission::create(['name' => $item]));
    }
}

Pada kode diatas, pertama - tama kita import terlebih dahulu model permission dari Spatie.

PermissionTableSeeder.php
use Spatie\Permission\Models\Permission;

Selanjutnya kita membuat sebuah collection yang didalamnya kita definiskan beberapa nama permissions yang akan kita gunakan, kemudian dari hasil collection tersebut kita loop menggunakan method each dan kita tambahkan data tersebut ke dalam tabel permissions kita.

PermissionTableSeeder.php
collect([
    'dashboard-access', 'dashboard-data',
    'permissions-access', 'permissions-data', 'permissions-create', 'permissions-update', 'permissions-delete',
    'roles-access', 'roles-data', 'roles-create', 'roles-update', 'roles-delete',
    'users-access', 'users-data', 'users-create', 'users-update', 'users-delete',
    'posts-access', 'posts-data', 'posts-create', 'posts-update', 'posts-delete',
])->each(fn($item) => Permission::create(['name' => $item]));

Seeder Role

Setelah berhasil membuat seeder permission kita akan lanjutkan untuk membuat seeder role , Silahkan teman - teman buka terminalnya kemudian jalankan perintah berikut ini.

Terminal
php artisan make:seeder RoleTableSeeder

Kemudian silahkan teman - teman buka file tersebut yang terletak di app/database/seeders, kemudian tambahkan kode berikut ini.

RoleTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class RoleTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Role::create(['name' => 'super-admin']);

        $post_permissions = Permission::where('name', 'like', '%posts%')->get();
        $post_role = Role::create(['name' => 'posts-access']);
        $post_role->givePermissionTo($post_permissions);

        $permission_permissions = Permission::where('name', 'like', '%permissions%')->get();
        $permission_role = Role::create(['name' => 'permissions-access']);
        $permission_role->givePermissionTo($permission_permissions);

        $role_permissions = Permission::where('name', 'like', '%roles%')->get();
        $role_role = Role::create(['name' => 'roles-access']);
        $role_role->givePermissionTo($role_permissions);

        $user_permissions = Permission::where('name', 'like', '%users%')->get();
        $user_role = Role::create(['name' => 'users-access']);
        $user_role->givePermissionTo($user_permissions);
    }
}

Pada kode diatas, pertama - tama kita import terlebih dahulu model permission dan role dari Spatie.

RoleTableSeeder.php
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

Selanjutnya kita melakukan insert data baru kedalam tabel roles menggunakan method create, dengan nama role super-admin.

RoleTableSeeder.php
Role::create(['name' => 'super-admin']);

Berikutnya kita melakukan pengambilan data permissions dengan nama posts menggunakan method where yang kita simpan didalam variabel $post_permissions.

RoleTableSeeder.php
$post_permissions = Permission::where('name', 'like', '%posts%')->get();

Selanjutnya kita melakukan insert data baru kedalam tabel roles menggunakan method create, dengan nama role posts-access.

RoleTableSeeder.php
$post_role = Role::create(['name' => 'posts-access']);

Kemudian role dengan nama posts-access, kita berikan sebuah permissions dari data yang kita simpan didalam variabel $post_permissions menggunakan method givePermissionTo yang telah disediakan oleh Laravel spatie.

RoleTableSeeder.php
$post_role->givePermissionTo($post_permissions);

Untuk beberapa role dan permissions dibawah penjelasannya sama seperti diatas.

RoleTableSeeder.php
$permission_permissions = Permission::where('name', 'like', '%permissions%')->get();
$permission_role = Role::create(['name' => 'permissions-access']);
$permission_role->givePermissionTo($permission_permissions);

$role_permissions = Permission::where('name', 'like', '%roles%')->get();
$role_role = Role::create(['name' => 'roles-access']);
$role_role->givePermissionTo($role_permissions);

$user_permissions = Permission::where('name', 'like', '%users%')->get();
$user_role = Role::create(['name' => 'users-access']);
$user_role->givePermissionTo($user_permissions);

Seeder User

Setelah berhasil membuat seeder role kita akan lanjutkan untuk membuat seeder user, Silahkan teman - teman buka terminalnya kemudian jalankan perintah berikut ini.

Terminal
php artisan make:seeder UserTableSeeder

Kemudian silahkan teman - teman buka file tersebut yang terletak di app/database/seeders, kemudian tambahkan kode berikut ini.

UserTableSeeder.php
<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $role = Role::where('name', 'super-admin')->first();

        $user = User::create([
            'name' => 'Rafi Taufiqurrahman',
            'email' => 'raf@dev.com',
            'password' => bcrypt('password'),
        ]);

        $user->assignRole($role);
    }
}

Pada kode diatas, pertama - tama kita import terlebih dahulu model user dan role.

UserTableSeeder.php
use App\Models\User;
use Spatie\Permission\Models\Role;

Selanjutnya kita membuat sebuah eloquent orm untuk melakukan pencarian data roles dengan nama super-admin menggunakan method where kemudian kita ambil data pertama yang ditemukan menggunakan method first, selanjutnya data tersebut kita simpan kedalam variabel role.

UserTableSeeder.php
$role = Role::where('name', 'super-admin')->first();

Berikutnya kita melakukan insert data baru kedalam tabel users.

UserTableSeeder.php
$user = User::create([
        'name' => 'Rafi Taufiqurrahman',
        'email' => 'raf@dev.com',
        'password' => bcrypt('password'),
    ]);

Terakhir user yang baru saja kita buat, kita berikan sebuah roles dari data yang kita simpan didalam variabel $role menggunakan method assignRole yang telah disediakan oleh Laravel spatie.

UserTableSeeder.php
$user->assignRole($role);

Factory Post

Setelah berhasil membuat beberapa file seeder, disini kita akan lanjutkan untuk membuat sebuah factory, gunanya untuk melakukan insert data baru kedalam tabel posts secara random sesuai jumlah yang kita tentukan, Silahkan teman - teman buka terminal-nya kemudian jalankan perintah berikut ini.

Terminal
php artisan make:factory PostFactory 

Selanjutnya silahkan buka file tersebut yang terletak di database/factories, kemudian masukan kode berikut ini.

PostFactory.php
<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
 */
class PostFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'user_id' => User::inRandomOrder()->first()->id,
            'title' => $this->faker->sentence(),
            'content' => $this->faker->paragraph(),
        ];
    }
}

Pada kode daitas, pertama - tama kita import model user terlebih dahulu.

PostFactory.php
use App\Models\User;

Selanjutnya pada method definition, kita menambahkan beberapa key diantaranya user_id, title dan content.

PostFactory.php
public function definition(): array
{
    return [
        'user_id' => User::inRandomOrder()->first()->id,
        'title' => $this->faker->sentence(),
        'content' => $this->faker->paragraph(),
    ];
}

Pada key user_id kita menggambil sebuah id data users secara acak menggunakan method inRandomOrder, dan method first kita gunakan untuk menangkap data pertama yang tampil. Selanjutnya pada key title kita menggunakan faker sentence untuk menghasilkan sebuah kalimat acak sebagai title. kemudian pada key content kita menggunakan faker paragraph untuk menghasilkan sebuah kalimat paragraf acak sebagai content.

Menjalankan Seeder & Factory

Setelah berhasil membuat beberapa seeder diatas, kita akan lanjutkan untuk melakukan pemanggilan data seeder tersebut. Silahkan teman - teman buka file DatabaseSeeder.php yang terletak di database/seeders, kemudian ubah kodenya menjadi berikut ini.

DatabaseSeeder.php
<?php

namespace Database\Seeders;

use App\Models\Post;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use App\Models\User;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        User::factory(10)->create();
        Post::factory(50)->create();

        $this->call([PermissionTableSeeder::class, RoleTableSeeder::class, UserTableSeeder::class]);
    }
}

Pada kode diatas, pertama - tama kita import terlebih dahulu model Post dan User.

DatabaseSeeder.php
use App\Models\Post;
use App\Models\User;

Selanjutnya pada method run, kita memanggil beberapa seeder dan factory yang telah kita buat sebelumnya.

DatabaseSeeder.php
User::factory(10)->create();
Post::factory(50)->create();

$this->call([PermissionTableSeeder::class, RoleTableSeeder::class, UserTableSeeder::class]);

Terakhir, silahkan teman - teman buka terminalnya kemudian jalankan perintah berikut ini.

php artisan migrate:fresh --seed

Penutup

Pada artikel kali ini kita telah berhasil membuat model, migration, factory dan seeder, selanjutnya kita akan membuat relasi antar tabel menggunakan eloquent relationships.

Artikel Lainnya

Beberapa artikel rekomendasi lainnya untuk menambah pengetahuan.

JurnalKoding

Mulai asah skill dengan berbagai macam teknologi - teknologi terbaru seperti Laravel, React, Vue, Inertia, Tailwind CSS, dan masih banyak lagi.

© 2024 JurnalKoding, Inc. All rights reserved.