Laravel secara default dalam salah satu fiturnya yakni Eloquent tidak mendukung penggunaan composite key, sehingga untuk mengatasi masalah ini ketika anda sedang berhadapan dengan schema database yang memiliki composite key, maka dapat diatasi dengan membuat sebuah Trait yang dapat digunakan untuk mengurai composite key pada semua Model jika dibutuhkan.
Buat direktori app\Traits
Buat file dengan nama CompositeKey.php kemudian masukkan code berikut:
<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Builder;
trait CompositeKey
{
public function getIncrementing()
{
return false;
}
protected function setKeysForSaveQuery(Builder $query)
{
$keys = $this->getKeyName();
if(!is_array($keys)){
return parent::setKeysForSaveQuery($query);
}
foreach($keys as $keyName){
$query->where($keyName, '=', $this->getKeyForSaveQuery($keyName));
}
return $query;
}
protected function getKeyForSaveQuery($keyName = null)
{
if(is_null($keyName)){
$keyName = $this->getKeyName();
}
if (isset($this->original[$keyName])) {
return $this->original[$keyName];
}
return $this->getAttribute($keyName);
}
}
Jika kamu ingin menggunakan Trait tersebut, pada tambahkan use statement:
use App\Traits\CompositeKey;
Kemudian didalam class model, tambahkan use statement berikutnya:
use CompositeKey;
Maka kamu sudah dapat mendefinisikan lebih dari satu primary key dalam model yang telah menggunakan Trait composite key tersebut:
protected $primaryKey = ['key1', 'key2'];