¶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 :
-
app/Models/Post.php
-
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.