Согласно laravel, Eloquent не поддерживает составные первичные ключи. Вы можете проверить эту проблему в laravel репозитории github здесь
Если вы действительно хотите это сделать, вы можете переопределить setKeysForSaveQuery
из Model.php
и настроить ключи.
По умолчанию:
protected function setKeysForSaveQuery(Builder $query)
{
$query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
$this->getKeyName()
вернет имя первичного ключа, а $this->getKeyForSaveQuery()
вернет значение ключа.
Это означает, что Eloquent всегда фильтрует только с 1 полем.
Этот метод будет вызываться после выполнения действия save
(UPDATE and DELETE
), и он генерирует WHERE
в SQL.
для, например, Поместите это в ту модель, которая использует составной первичный ключ:
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);
}