如何在 ORM 中创建组合键 Eloquent Laravel 6.2

How to create composite key in ORM Eloquent Laravel 6.2

我想在我的数据库中的两个 table 之间创建一个组合键。我找到了如何在迁移中创建它,但对于 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']);
});

所以我尝试在模型中创建属于关系,但是当我尝试保存我的对象时,没有任何追加,而且我的数据库中没有任何行。所以我认为这是错误的方式。

如果你有想法请帮帮我^^。

根据 laravel,Eloquent 不支持复合主键。 您可以在 laravel github 存储库 here

上查看此问题

如果您真的想这样做,那么您可以覆盖 Model.phpsetKeysForSaveQuery 并设置您的密钥。

By Default:

protected function setKeysForSaveQuery(Builder $query)
{
    $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());

    return $query;
}

$this->getKeyName() 将 return 主键名称和 $this->getKeyForSaveQuery() 将 return 键的值。

这意味着 Eloquent 始终只过滤 1 个字段。

这将在您执行 save 操作 (UPDATE and DELETE) 时调用,它的作用是在 SQL 中生成一个 WHERE 子句。

for e.g. Put this into that model that uses a composite primary key:

   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);
    }

如果您在 setKeysForSaveQuery() 定义中使用 Builder 参数类型,那么您还需要将以下内容添加到模型的顶部:

use Illuminate\Database\Eloquent\Builder;