如何在 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.php
的 setKeysForSaveQuery
并设置您的密钥。
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;
我想在我的数据库中的两个 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.php
的 setKeysForSaveQuery
并设置您的密钥。
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;