【问题标题】:Laravel migrations - foreign key not applying to the tableLaravel 迁移 - 外键不适用于表
【发布时间】:2017-06-05 18:05:00
【问题描述】:

我尝试使用迁移添加外键约束。迁移完成,没有任何错误。但是,在检查数据库时,不会将外键约束添加到表中。除了 FK 约束之外,迁移中指定的其他内容都可以正常工作。

我的带有 FK 的数据透视表:

Schema::create('book_author', function (Blueprint $table) {

            $table->integer('book_id')->unsigned();
            $table->integer('author_id')->unsigned();

            $table->foreign('book_id')->references('id')->on('book')->onDelete('restrict')->onUpdate('cascade');
            $table->foreign('author_id')->references('id')->on('author')->onDelete('restrict')->onUpdate('cascade');
            $table->primary(['book_id','author_id']);

        });
        Schema::enableForeignKeyConstraints();

作者表:

Schema::create('author', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email', 250)->unique();
        });

书桌:

 Schema::create('book', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
        });

这里有什么我遗漏的吗?

【问题讨论】:

  • 哪个数据库?您如何检查以确保外键存在?
  • 通过为两列添加一个带有虚假“id”值的字段。
  • 你的表引擎是 InnoDB 还是 MyISAM?
  • 您是否尝试过我在回答中建议的更改?如果是这样,问题仍然存在吗?
  • 是的。结果相同。没有不同。顺便说一句,我没有拒绝你的回答。

标签: php laravel laravel-migrations


【解决方案1】:

MyISAM 不支持外键:http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

运行以下命令以确保您的表具有哪个引擎:

SHOW TABLE STATUS WHERE Name = 'book_author'

如果显示MyISAM,您有两种选择:

  1. 完全不要使用 FK
  2. 更换引擎

我会选择选项 2,因为您正在创建一个新表,这里没有丢失数据的风险。

您可以通过以下方式强制迁移:

$table->engine = 'InnoDB';

或者,您可以手动运行此命令:

ALTER TABLE book_author ENGINE=INNODB

【讨论】:

    【解决方案2】:

    将您的 book_author 迁移更改为:

    Schema::create('book_author', function (Blueprint $table) {
        $table->integer('book_id')->unsigned()->index();
        $table->integer('author_id')->unsigned()->index();
    
        $table->foreign('book_id')->references('id')->on('book')->onDelete('cascade')->onUpdate('cascade');
        $table->foreign('author_id')->references('id')->on('author')->onDelete('cascade')->onUpdate('cascade');
    });
    

    这应该可行。


    另一方面,您的表名打破了 Laravel 的一些约定:

    1. 以复数形式命名您的表格(authors & books
    2. 数据透视表 (book_author) 应称为 (author_book) - 字母优先级

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2020-06-05
      • 1970-01-01
      • 2021-02-08
      • 2021-09-05
      • 2021-10-13
      • 2016-06-06
      • 2019-09-23
      • 1970-01-01
      相关资源
      最近更新 更多