Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在ORM Eloquent Laravel 6.2中创建复合密钥_Php_Laravel_Eloquent_Laravel 6.2 - Fatal编程技术网

Php 如何在ORM Eloquent Laravel 6.2中创建复合密钥

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

我想在数据库中的两个表之间创建一个复合键。我已经找到了如何在迁移中创建它,但对于雄辩的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行。所以我认为这是错误的方法


如果您有什么想法,请帮助我。^。

根据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;