Laravel - 多个主键

Posted

技术标签:

【中文标题】Laravel - 多个主键【英文标题】:Laravel - Multiple primary key 【发布时间】:2014-12-08 07:27:23 【问题描述】:

我是 Laravel 框架的新手,我也尝试使用 2 个外键创建表,我希望它们成为该表中的主键。但是我写php artisan migrate的时候报错

SQLSTATE[42000]:语法错误或访问冲突:1068 多主 ke y 已定义(SQL:alter table doc_tag 添加主键 doc_tag_id_tag_primar y(id_tag)

Schema::create('doc_tag', function(Blueprint $table)

    $table->integer('id_doc')->unsigned();
    $table->primary('id_doc');
    $table->foreign('id_doc')
                ->references('id')
                ->on('doc');
    $table->integer('id_tag')->unsigned();
    $table->primary('id_tag');
    $table->foreign('id_tag')
                ->references('id')
                ->on('tag');
);

我知道 SQL 代码是:(但我真的不知道如何在 Laravel 中翻译这个 SQL 代码)

CREATE TABLE IF NOT EXISTS `Doc_project`.`document_has_Tags` (
  `document_id_document` INT NOT NULL,
  `Tags_id_Tag` INT NOT NULL,
  PRIMARY KEY (`document_id_document`, `Tags_id_Tag`),
  INDEX `fk_document_has_Tags_Tags1_idx` (`Tags_id_Tag` ASC),
  INDEX `fk_document_has_Tags_document1_idx` (`document_id_document` ASC),
  CONSTRAINT `fk_document_has_Tags_document1`
    FOREIGN KEY (`document_id_document`)
    REFERENCES `Doc_project`.`document` (`id_document`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_document_has_Tags_Tags1`
    FOREIGN KEY (`Tags_id_Tag`)
    REFERENCES `Doc_project`.`Tags` (`id_Tag`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

这是一个 N:N 关系

有人有想法吗?

【问题讨论】:

【参考方案1】:

Eloquent 不支持多个主键,但如果您仍然需要它,请将数组发送到您的 primary(...)

所以在你的情况下:

Schema::create('doc_tag', function(Blueprint $table)

    $table->integer('id_doc')->unsigned();
    $table->integer('id_tag')->unsigned();

    $table->primary(['id_tag', 'id_doc']);

    $table->foreign('id_doc')
                ->references('id')
                ->on('doc');    
    $table->foreign('id_tag')
                ->references('id')
                ->on('tag');
);

【讨论】:

感谢您的帮助。在 mysql 上,我看到 id 现在是主要的,但是当我运行此命令时出现相同的错误是正常的: php artisan migrate ?【参考方案2】:

如果您想在 2 列或更多列上创建主键,您应该使用:

$table->primary(['id_doc','id_tag']);

【讨论】:

以上是关于Laravel - 多个主键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7 迁移:语法错误或访问冲突:1068 定义了多个主键

laravel 1对多,主键不是整型的坑

laravel多对多关联模型

Laravel中定义复合主键

主键与 laravel 搜索的默认 id 不同

是否可以根据 Laravel 的 ORM 中的多个列删除重复项?