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

4zcjmb1e  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(101)

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

所以我试着在模型中建立一个属于关系,但是当我试着保存我的对象时,没有任何附加,我的数据库中没有任何行。所以我觉得这条路不对。
如果你有什么想法,请帮助我。

n6lpvg4x

n6lpvg4x1#

根据laravel,Eloquent不支持复合主键。您可以在laravel github repository here上检查此问题
如果你真的想这样做,那么你可以覆盖Model.phpsetKeysForSaveQuery并设置你的密钥。
默认情况下:

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

    return $query;
}

$this->getKeyName()将返回主键名称,$this->getKeyForSaveQuery()将返回键的值。

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

这将在执行save操作(UPDATE and DELETE)时被调用,它所做的是在SQL中生成WHERE子句。
for例如,将此放入使用复合主键的模型中:

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;
jtjikinw

jtjikinw2#

我知道这是一个老职位,但这里是我如何处理它使用本地范围查询
1-在Model中:

use Illuminate\Database\Eloquent\Builder;

  public function scopeComposited(Builder $q, $first_key, $second_key)
  {
    $q->where(["first_key" => $first_key, "second_key" => $second_key]);
  }

2-要检索模型,请将"Model"替换为您的Model name

Model::composited(1,2)->first();

相关问题