Akademi Manajemen Informatika

Halo Bakat Digital! Gimana kabarnya hari ini? Semoga tetap semangat buat belajar ya…

Selamat datang kembali di blog Sandi Dharma. Pada kesempatan kali ini, kita akan belajar framework laravel ya. Kita akan belajar bagaimana Metode menggunakan UUID sebagai primary key di laravel.

Kalau Anda belum tau apa itu framework laravel, Anda Dapat baca dulu postingan kita sebelumnya tentang framework laravel di sini.

Primary Key Di Laravel

Kalau Anda pernah mencoba laravel, kemungkinan besar Anda akan menyadari bahwa secara default laravel akan membuatkan primary key bertipe integer dan auto increment ketika kita Membangun database migration Buat Membangun tabel. Anda juga Dapat Menonton pada file migrasi bawaan laravel Buat tabel users yang juga menggunakan primary key bertipe integer dan auto increment secara default.

Update: Laravel versi 9 telah Mempunyai fitur UUID Buat primary key yang dapat diterapkan dengan mudah dan singkat, selengkapnya Dapat Anda cek di dokumentasi resminya:
https://laravel.com/docs/9.x/eloquent#uuid-and-ulid-keys

Apa Yang Salah Dengan Auto Increment?

Sebenarnya Kagak Eksis yang salah ya Kalau menggunakan auto increment Buat Membangun primary key. Tetapi, Kalau aplikasi yang Anda buat Mempunyai skala yang besar mungkin Anda Dapat mempertimbangkan kembali Kalau Ingin menggunakan auto increment.

Auto incrmeent mungkin akan menimbulkan beberapa masalah dalam hal database replica dan database sharding. Berikut ini beberapa Surat keterangan yang Dapat Anda baca mengenai database replica dan database sharding.

Data Replication in DBMS

Understanding Database Sharding

Selain itu, auto increment mungkin akan mudah ditebak Kalau ditampilkan pada url contohnya seperti berikut:

https://example.com/users/39

Dibandingkan dengan ini:

https://example.com/users/028d9b18-c274-4f7c-bb70-9e7020a9ce9f

Di samping itu, Kalau tabel yang Anda buat hanya menyimpan data Tetap yang simpel contohnya seperti jenis user atau kategori Naskah, penggunaan autoincrement sepertinya Kagak begitu bermasalah.

Menggunakan UUID Primary Key Di Laravel

Sebagai bahan percobaan, Anda Dapat siapkan dulu project laravel baru dan buat database Buat project Anda. Jangan lupa Buat konfigurasi koneksi database di environment variable ya.

Setelah Membangun project dan konfigurasi database, langkah selanjutnya kita akan Membangun Teladan data sederhana Yakni student.

Buka terminal Anda dan jalankan perintah berikut Buat Membangun model student beserta migrasinya.

php artisan make:model Student -m

Setelah itu, edit skema Buat table students pada file migrasi student menjadi seperti ini:

Schema::create('students', function (Blueprint $table) {
  $table->uuid('id')->primary(); // menggunakan uuid sebagai primary key
  $table->string('name');
  $table->string('class');
  $table->timestamps();
});

Jangan lupa simpan perubahannya. Setelah itu, kita Dapat lakukan migrasi database.

READ  KPI Fleet Management: Fungsi, Manfaat, dan Implementasi

Sekarang tabel students sudah dibuat dan menggunakan uuid sebagai primary key. Tetapi, Demi ini Kalau kita Ingin Membangun data student baru kita harus Membangun UUID secara manual. Tentu ini Dapat sangat merepotkan ya. Oleh karena itu kita akan memodifikasi model Student kita agar menjadi seperti berikut ini:

php

namespace App\Models;

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

class Student extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'class'
    ];

    /**
     * Kita override boot method
     *
     * Mengisi primary key secara Mekanis dengan UUID ketika Membangun record
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if (empty($model->{$model->getKeyName()})) {
                $model->{$model->getKeyName()} = Str::uuid()->toString();
            }
        });
    }

    /**
     * Kita override getIncrementing method
     *
     * Menonaktifkan auto increment
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Kita override getKeyType method
     *
     * Memberi Mengerti laravel bahwa model ini menggunakan primary key bertipe string
     */
    public function getKeyType()
    {
        return 'string';
    }
}

Sekarang ketika kita Membangun data student baru kita Kagak perlu Membangun UUID secara manual karena telah dibuat Mekanis.

Kita Dapat mencoba menambahkan data student menggunakan Sokongan tinker.

Data Tetap Hampa:

>>> Student::all()
=> Illuminate\Database\Eloquent\Collection {#3964
     all: [],
   }

>>>

Coba Membangun data:

>>> Student::create(['name' => 'Rizky Kurniawan', 'class'=> 'XII C'])
=> App\Models\Student {#4368
     name: "Rizky Kurniawan",
     class: "XII C",
     id: "3be14193-bce3-468f-abd6-1b5ad5ffd716",
     updated_at: "2022-09-27 03:11:16",
     created_at: "2022-09-27 03:11:16",
   }

>>>

Membangun data Kembali:

>>> Student::create(['name' => 'Ruang Developer', 'class'=> 'XII A'])
=> App\Models\Student {#3964
     name: "Sandi Dharma",
     class: "XII A",
     id: "18b1a264-a5ae-4422-9b61-07994d988959",
     updated_at: "2022-09-27 03:12:35",
     created_at: "2022-09-27 03:12:35",
   }

>>>

List data:

>>> Student::all()
=> Illuminate\Database\Eloquent\Collection {#4606
     all: [
       App\Models\Student {#4604
         id: "3be14193-bce3-468f-abd6-1b5ad5ffd716",
         name: "Rizky Kurniawan",
         class: "XII C",
         created_at: "2022-09-27 03:11:16",
         updated_at: "2022-09-27 03:11:16",
       },
       App\Models\Student {#4580
         id: "18b1a264-a5ae-4422-9b61-07994d988959",
         name: "Sandi Dharma",
         class: "XII A",
         created_at: "2022-09-27 03:12:35",
         updated_at: "2022-09-27 03:12:35",
       },
     ],
   }

>>>

Nah, sekarang Anda Dapat Menonton bahwa UUID Buat primary key kita secara Mekanis dibuatkan ketika Membangun data baru.

READ  Pengertian, Misalnya, dan 7 Komponennya

NB: Di sini saya menggunakan laravel versi 9.*

UUID Sebagai Foreign Key

Ketika kita Ingin mendefinisikan foreign key yang bertipe UUID, kita Dapat menggunakan method berikut ini:

$table->foreignUlid('nama kolom');

Sebagai Teladan, dengan Metode yang sama seperti sebelumnya saya Membangun tabel dan model baru Buat menyimpan score. Berikut skema tabelnya:

Schema::create('scores', function (Blueprint $table) {
  $table->uuid('id')->primary();
  $table->foreignUlid('student_id'); // foreign id Buat tabel student
  $table->integer('score');
  $table->timestamps();
});

Dan ini adalah Score model:

php

namespace App\Models;

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

class Score extends Model
{
    use HasFactory;

    protected $fillable = [
        'student_id',
        'score',
    ];

    public function student()
    {
        return $this->belongsTo(Student::class);
    }

    /**
     * Kita override boot method
     *
     * Mengisi primary key secara Mekanis dengan UUID ketika Membangun record
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if (empty($model->{$model->getKeyName()})) {
                $model->{$model->getKeyName()} = Str::uuid()->toString();
            }
        });
    }

    /**
     * Kita override getIncrementing method
     *
     * Menonaktifkan auto increment
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Kita override getKeyType method
     *
     * Memberi Mengerti laravel bahwa model ini menggunakan primary key bertipe string
     */
    public function getKeyType()
    {
        return 'string';
    }
}

Jangan lupa tambahkan Rekanan juga di Student model:

public function score()
{
  return $this->hasOne(Score::class);
}

Coba nambah score melalui tinker:

>>> Score::create(['student_id' => '3be14193-bce3-468f-abd6-1b5ad5ffd716', 'score' => 90])
=> App\Models\Score {#4613
     student_id: "3be14193-bce3-468f-abd6-1b5ad5ffd716",
     score: 90,
     id: "290249eb-b1e7-4496-a47d-c190fe06add2",
     updated_at: "2022-09-27 03:35:32",
     created_at: "2022-09-27 03:35:32",
   }

>>>

List data score:

>>> Score::with('student')->get()
=> Illuminate\Database\Eloquent\Collection {#3623
     all: [
       App\Models\Score {#4616
         id: "290249eb-b1e7-4496-a47d-c190fe06add2",
         student_id: "3be14193-bce3-468f-abd6-1b5ad5ffd716",
         score: 90,
         created_at: "2022-09-27 03:35:32",
         updated_at: "2022-09-27 03:35:32",
         student: App\Models\Student {#4621
           id: "3be14193-bce3-468f-abd6-1b5ad5ffd716",
           name: "Rizky Kurniawan",
           class: "XII C",
           created_at: "2022-09-27 03:11:16",
           updated_at: "2022-09-27 03:11:16",
         },
       },
     ],
   }

>>>

Menggunakan Trait Pada Model Buat Membangun UUID

Sekarang Kalau Anda perhatikan, kita menuliskan kode yang sama pada Student model dan Score model Buat Membangun UUID. Hal ini tentu sangat Kagak efisien dalam penulisan kode. Oleh karena itu, kita Dapat memisahkan bagian pembuatan uuid ke menjadi sebuah trait sehingga Dapat kita panggil pada setiap model yang membutuhkan uuid sebagai primary key.

READ  7 Software Kontraktor Terbaik Kepada Perusahaan Bangunan

Dalam folder app buatlah folder baru bernama Traits, dan di dalamnya buat satu buah file bernama UUIDAsPrimaryKey.php yang berisi kode trait seperti berikut:

php

namespace App\Traits;

use Illuminate\Support\Str;

trait UUIDAsPrimaryKey
{
    /**
     * Kita override boot method
     *
     * Mengisi primary key secara Mekanis dengan UUID ketika Membangun record
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if (empty($model->{$model->getKeyName()})) {
                $model->{$model->getKeyName()} = Str::uuid()->toString();
            }
        });
    }

    /**
     * Kita override getIncrementing method
     *
     * Menonaktifkan auto increment
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Kita override getKeyType method
     *
     * Memberi Mengerti laravel bahwa model ini menggunakan primary key bertipe string
     */
    public function getKeyType()
    {
        return 'string';
    }
}

Sekarang kita Dapat menggunakan trait tersebut di Sekalian model yang membutuhkan UIID sebagai primary key.

Mari kita ubah Student model menggunakan trait UUIDAsPrimaryKey agar lebih ringkas menjadi seperti ini:

php

namespace App\Models;

use App\Traits\UUIDAsPrimaryKey;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    use HasFactory, UUIDAsPrimaryKey;

    protected $fillable = [
        'name',
        'class'
    ];

    public function score()
    {
        return $this->hasOne(Score::class);
    }
}

Score model juga:

php

namespace App\Models;

use App\Traits\UUIDAsPrimaryKey;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Score extends Model
{
    use HasFactory, UUIDAsPrimaryKey;

    protected $fillable = [
        'student_id',
        'score',
    ];

    public function student()
    {
        return $this->belongsTo(Student::class);
    }
}

Hasil

Selamat! Sekarang Anda sudah Dapat menggunakan UUID sebagai alternatif primary key selain integer auto increment. Selain UUID, Tetap Eksis beberapa alternatif yang Dapat Anda gunakan Buat Membangun primary key. Salah satunya adalah fungsi uniqid() Punya php.