4

问题

我想向表中添加外键。当我运行我的第一次迁移create_posts_table时,如下所示:

Schema::create('posts', function(Blueprint $table) {
    $table->engine = 'InnoDB';

    $table->increments('id');
    $table->unsignedInteger('user_id')->index();

    // . . .
});

Schema::table('posts', function(Blueprint $table)
{
    $table->foreign('user_id')->references('id')
          ->on('users')->onDelete('cascade');
});

抛出以下错误:

[照亮\数据库\查询异常] SQLSTATE [HY000]:

一般错误:1215 无法添加外键约束(SQL: 删除级联时更改表posts添加约束posts_user_id_foreign外键(user_id)引用users( ))id

这是因为该users 表尚未创建,因此未能在该表上创建用户的引用外键posts

可能的解决方案

解决这个问题的方法是在所有表都创建完成后,通过新的迁移添加外键。但是,这对我来说似乎很笨拙。

问题

如何在各自表的迁移中定义外键,而不是在创建所有表后使用不同的迁移单独添加它们?

4

2 回答 2

3

您可以在同一个迁移文件中执行多个迁移。如果您有一个希望用户表的外键的帖子表,但用户表尚不存在,则您必须在创建用户表后在用户表迁移文件中执行此操作 - 或者您必须像你说的那样做一个单独的迁移。您不能“保存”说明以供以后迁移。

于 2016-06-04T11:08:47.130 回答
0

在 laravel 中,使用索引、主键和外键为不同的表保留单独的迁移文件.....

创建用户表

class CreateUsersTable extends Migration
{

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('email');
        $table->string('password', 60);            
        $table->enum('status', ['0', '1'])->default('0');
        $table->rememberToken();
        $table->nullableTimestamps();

        $table->unique('email');

        });
    }

    public function down()
    {
        Schema::drop('users');
    }
}

创建帖子表

class CreatePostsTable extends Migration
{

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();         

            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    public function down()
    {
        Schema::drop('posts');
    }
}
于 2016-07-03T10:45:41.450 回答