aeneas sineld dediği gibi uuid kullanılabilir ama bazı problemleri var. Uuid string bir ifade, veri tabanında binary tutulması gerekiyor. Yer ve hız konusunda integer kadar iyi olmayacaktır. O yüzden kullandığınız veri tabanının uuid desteğini, uuid'ye nasıl yaklaştığını araştırıp mutlaka öğrenin, sonra sürpriz yaşamayın.
Benim bu konudaki tavsiyem hem id hem de uuid ikisi birlikte kullanmak. id yine auto increment primary key olacak, uuid ise unique index'e sahip bir alan olacak; alan tipi desteği varsa uuid (PostgreSQL'in var) yoksa binary(16) olacak. Binary olursa veri tabanına yazarken önce binary'ye dönüştürmeniz gerekecek demektir; okurken de binary'den uuid'ye. Binary olursa hem hızlı çalışır hem de az yer kaplar. Kendi iç işlemlerinizi klasik id ile yapacaksınız, mesela ilişkileri id ile kuracaksınız ama normal kullanıcıların göreceği yerleri uuid ile yapacaksınız. Mesela bir kullanıcının bilgisine ulaşmak için:
Route::get('user/{uuid}', [UserController::class, 'show']);
public function show($uuid)
{
return UserResource::make(
User::where('uuid', $uuid)->firstOrFail()
);
}
GET users/43f036bb-99de-4258-bfa6-e28ee9969b7a
yapacaksınız ama bu kullanıcının Order modeli ile bağı varsa:
public function orders(): HasMany
{
return $this->hasMany(Order::class, 'user_id'); // Yani ilişkiyi user_uuid ile kurmayacaksınız.
}
şeklinde ilişkiyi yine id ile kuracaksınız. Böylece dış kullanıcılar uuid görecek ama sizin internal yapı klasik id ile çalışmaya devam edecek.