如何在 ORM 雄辩的拉拉维尔 6.2 中创建复合密钥

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

});

因此,我试图在模型中建立一种归属关系,但是当我尝试保存我的对象时,没有任何附加内容,并且我的数据库中没有 anny 行。所以我认为这是错误的方式。


如果你有一个想法,请帮我^^。


qq_笑_17
浏览 105回答 1
1回答

GCT1015

根据拉拉维尔的说法,雄辩不支持复合主键。你可以在这里查看这个问题如果您真的想这样做,那么您可以覆盖并设置您的密钥。setKeysForSaveQueryModel.php默认情况下:protected function setKeysForSaveQuery(Builder $query){    $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());    return $query;}$this->getKeyName()将返回主键名称,并将返回键的值。$this->getKeyForSaveQuery()这意味着雄辩总是只用1个字段进行过滤。一旦你执行了一个动作(),它就会被调用,它的作用是在SQL中生成一个子句。saveUPDATE and DELETEWHERE例如,将其放入使用复合主键的模型中:   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() 定义中使用生成器参数类型,则还需要将以下内容添加到模型的顶部:use Illuminate\Database\Eloquent\Builder;
打开App,查看更多内容
随时随地看视频慕课网APP