Tutorial Laravel 9 - Part #8 - Mengenal Tinker, Factory dan Seeder

Hello, kali ini kita akan membahas tentang Tinker, Factory dan Seeder di Laravel 9. Ketiga fitur ini akan sangat membantu kita pada saat development aplikasi. Utamanya dalam pembuatan sampel data untuk testing. Namun sebelumnya, saya asumsikan bahwa Anda telah menginstall project laravel dari awal dan juga telah melakukan konfigurasi database. Jika belum, Anda dapat mengikuti Tutorial Instalasi Laravel 9 yang telah diposting sebelumnya.

Tinker

Tinker adalah shell interface atau console di Laravel yang dapat mengakomodasi kita berinteraksi dalam aplikasi Laravel yang meliputi interaksi dengan Eloquent model, job, event dan sebagainya. Untuk masuk ke Tinker environment ketikkan perintah berikut:

php artisan tinker

Tampilannya seperti berikut:

Factory

Ketika melakukan testing aplikasi, biasanya kita membutuhkan beberapa baris sampel data di tabel database. Menambahkan sampel data ke database secara manual satu per satu adalah hal yang membosankan. Dengan menggunakan model factory kita dapat mendefinisikan default attribute value pada setiap eloquent model yang kita punya. Apabila kita sudah mempunyai model (misal: Product), kita dapat membuat factory dengan perintah berikut:

php artisan make:factory ProductFactory

Kita juga dapat membuat Migration, Model, dan Factory dengan satu perintah seperti berikut:

php artisan make:model Product -mf

Maka akan tergenerate file migration, model, dan factory seperti berikut:

Ubah file migration menjadi seperti berikut:

<?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('products', function (Blueprint $table) {
            $table->id();
            $table->string('sku')->index();;
            $table->string('name');
            $table->decimal('price', 15, 2)->nullable();
            $table->integer('stock')->default(0);
            $table->timestamps();
        });
    }

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

Ubah ProductFactory (database/factories/ProductFactory) menjadi seperti berikut:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Product>
 */
class ProductFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            'sku' => Str::random(10),
            'name' => fake()->name(),
            'price' => fake()->randomNumber(4),
            'stock' => fake()->randomNumber(2), 
        ];
    }
}

Pemanggilan method fake() di atas adalah proses mengenerate fake data menggunakan library FakerPHP

Selanjutnya, jalankan migrasi database dengan perintah:

php artisan migrate

Model

Kita perlu mendefinisikan properti fillable pada model Product agar dapat menyimpan data ke tabel products. Ubah model Product menjadi seperti berikut:

<?php

namespace App\Models;

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

class Product extends Model
{
    use HasFactory;

    protected $fillabe = [
        'sku',
        'name',
        'price',
        'stock',
    ];
}

Membuat Sampel Data via Tinker

Sebelumnya silahkan masuk ke Tinker console dengan perintah:

php artisan tinker

Kita dapat membuat sampel data via Tinker dengan menjalankan model factory ProductFactory yang telah kita buat sebelumnya dengan perintah seperti berikut:

Product::factory()->create();

Hasilnya adalah:

Pada tampilan di atas terlihat 1 baris sampel data terbuat dan tersimpan ke dalam tabel products. Kita juga dapat membuat banyak sampel data dalam satu kali perintah seperti berikut:

Product::factory()->count(5)->create();

Seeder

Laravel memberikan kemudahan untuk membuat initial data ke dalam tabel database dengan adanya Seed Classs yang tersimpan pada folder database/seeders. Kita dapat membuat seeder dengan factory model Product yang telah kita buat sebelum di atas dengan perintah berikut:

php artisan make:seeder ProductSeeder

maka akan tergenerate file database/seeders/ProductSeeder.php. Buka kemudian lakukan perubahan menjadi seperti berikut:

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Product;

class ProductSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Product::factory()->count(5)->create();
    }
}

Selanjutnya, kita perlu memanggil ProductSeeder ini di dalam class DatabaseSeeder (database/seeders/DatabaseSeeder.php):

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            ProductSeeder::class,
        ]);
    }
}

Untuk menjalan seeder di Laravel lakukan dengan perintah berikut:

php artisan db:seed

Maka, seeder class yang telah kita buat di atas akan dieksekusi:

Dan kalau kita cek di tabel products di database kita, maka akan terbuat beberapa sampel data seperti berikut:

Gimana, makin seru kan??? Selamat mencoba!

Tulis Komentar