Как создать составной ключ в ORM Eloquent Laravel 6.2 - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы создать составной ключ между двумя таблицами в моей базе данных. Я нашел, как создать это в миграции, но для Eloquente ORM я ничего не нашел.

Итак, вот моя миграция:

Schema::create('passages', function (Blueprint $table) {
            $table->unsignedBigInteger('id_contract');
            $table->integer('month');
            $table->integer('year');
            $table->text('object');
            $table->integer('nbPassage');
            $table->decimal('priceExclTax');
            $table->timestamps();

            $table->foreign('id_contract')->references('id')->on('contracts');
            $table->primary(['id_contract','mois','annee']);
});

Итак, я пытаюсь сделать в модели отношение принадлежности, но когда я пытаюсь сохранить свой объект, ничего не добавляется, и у меня нет Любая строка в моей базе данных. Поэтому я думаю, что это неправильный путь.

Если у вас есть идея, пожалуйста, помогите мне ^^.

1 Ответ

1 голос
/ 10 февраля 2020

Согласно 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);
    }
...