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.
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.
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.
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.
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.