April 21, 2024 laravel

Cara Mengubah Key Untuk Route Model Binding Laravel

Secara default key yang digunakan untuk route model binding laravel adalah id. Untuk menggunakan key lainnya, ada beberapa cara yang bisa dilakukan:

Cara 1 : Mendefinisikan Key di Route

Cara pertama adalah dengan mendefinisikan key langsung di parameter route dengan sintaks model:nama-key. Contoh.

Route::get('/users/{user:email}', [UserController::class, 'show']);

Route diatas akan menggunakan kolom email sebagai key route model binding.

Cara 2 : Override Method getRouteKeyName di Model

Cara kedua adalah dengan meng-override method getRouteKeyName di model. Method ini mengembalikan key model yang digunakan sebagai route model binding. Contoh.

/**
 * Get the route key for the model.
 */
public function getRouteKeyName(): string
{
    return 'email';
}

Cara ini akan meng-override setiap key route model binding pada model tersebut. Misal kode diatas ada pada model User maka setiap route model bindng User akan menggunakan email sebagai key-nya.

Cara 3 : Explicit Binding

Cara ketiga adalah dengan menggunakan explicit binding. Dengan explicit binding route parameter dapat didefinisikan bagaimana query untuk binding ke modelnya. Explicit binding ditambahkan di AppServiceProvider.

Contoh

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Route::bind('user', function (string $value) {
        return User::where('email', $value)->firstOrFail();
    });
}

Contoh diatas, setiap parameter user akan di binding ke model User dengan kolom email sebagai key-nya.

Cara 4 : Override Method resolveRouteBinding di Model

Cara keempat adalah dengan meng-override method resolveRouteBinding di model. Method ini menerima nilai key binding dari parameter url route dan mengembalikan query untuk binding ke model.

/**
 * Retrieve the model for a bound value.
 *
 * @param  mixed  $value
 * @param  string|null  $field
 * @return \Illuminate\Database\Eloquent\Model|null
 */
public function resolveRouteBinding($value, $field = null)
{
    return $this->where('email', $value)->firstOrFail();
}

Kesimpulan

Jika ingin mengganti key saja dan pada satu route saja maka gunakan cara pertama, jika ingin mengganti key saja dan semua route maka gunakan cara kedua. Jika ingin mengubah query untuk binding ke modelnya bisa menggunakan cara 3 dan 4.

Sumber: