Laravel - 多个主键

8

我是 Laravel 框架的新手,我尝试创建一个有两个外键并且希望它们成为表中主键的表。但是当我运行 php artisan migrate 时出现了错误。

SQLSTATE[42000]: Syntax error or access violation: 1068 多个主键被定义 (SQL: alter table doc_tag add primary key doc_tag_id_tag_primary(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关系。

有人有想法吗?

2个回答

15

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');
});

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexis

3

如果你想在两个或更多列上创建主键,你应该使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接