Php 如何在ORM Eloquent Laravel 6.2中创建复合密钥
我想在数据库中的两个表之间创建一个复合键。我已经找到了如何在迁移中创建它,但对于雄辩的ORM,我什么也没有找到 下面是我的迁移: Schema::创建“通道”,函数蓝图$table{ $table->unsignedbiginger'id_contract'; $table->整数“月”; $table->integer'year'; $table->text'object'; $table->integer'nbPassage'; $table->十进制“价格不含税”; $table->timestamps; $table->foreign'id_contract'->在'contracts'上引用'id'->; $table->primary['id_contract','mois','annee']; }; 所以我尝试在模型中建立一个归属关系,但当我尝试保存我的对象时,没有任何附加,并且我的数据库中没有anny行。所以我认为这是错误的方法Php 如何在ORM Eloquent Laravel 6.2中创建复合密钥,php,laravel,eloquent,laravel-6.2,Php,Laravel,Eloquent,Laravel 6.2,我想在数据库中的两个表之间创建一个复合键。我已经找到了如何在迁移中创建它,但对于雄辩的ORM,我什么也没有找到 下面是我的迁移: Schema::创建“通道”,函数蓝图$table{ $table->unsignedbiginger'id_contract'; $table->整数“月”; $table->integer'year'; $table->text'object'; $table->integer'nbPassage'; $table->十进制“价格不含税”; $table->tim
如果您有什么想法,请帮助我。^。根据laravel的说法,Eloquent不支持复合主键。 您可以在laravel github存储库中检查此问题 如果您确实想这样做,那么您可以覆盖Model.php的setKeysForSaveQuery并设置密钥 默认情况下: $this->getKeyName将返回主键名和 $this->getKeyForSaveQuery将返回键的值 这意味着雄辩总是只过滤1个字段 这将在执行save操作UPDATE和DELETE后调用,它的作用是在SQL中生成WHERE子句 例如。 将其放入使用复合主键的模型中: 如果在setKeysForSaveQuery定义中使用生成器参数类型,则还需要将以下内容添加到模型顶部:
use Illuminate\Database\Eloquent\Builder;
我不明白你想做什么。你的代码看起来不错。请给出一个你想要实现的具体例子。不幸的是,你不能拥有雄辩的复合主键。你需要它作为复合主键,而不是向字段添加唯一索引,这有什么原因吗?我在应用程序中使用复合键的示例,或者代码示例?是的,我需要它,因为对于合同,我不想在同一年的同一个月有两篇文章,为什么你不能用一个独特的索引来达到这个目的呢?谢谢,这很有效。我不知道为什么不在laravel中实现,它的使用非常简单。@MrSolarius如果您有一个复合键,那么引用此表的每个关系都需要复制复合键的所有列,这通常并不理想。
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);
}
use Illuminate\Database\Eloquent\Builder;