【问题标题】:How to define foreign keys in migrations?如何在迁移中定义外键?
【发布时间】:2016-10-04 09:41:33
【问题描述】:

问题

我想给表添加外键。当我运行 first 迁移 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');
});

抛出以下错误:

[Illuminate\Database\QueryException] SQLSTATE[HY000]:

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

这是因为users表还没有创建,所以无法在posts表上创建用户的引用外键。

可能的解决方案

解决此问题的方法是在创建所有表后添加具有新迁移的外键。但是,它对我来说似乎很笨重。

问题

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

【问题讨论】:

    标签: laravel laravel-5 laravel-5.2 laravel-migrations


    【解决方案1】:

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

    【讨论】:

    • 那么,这些是唯一的选择吗?
    • 恐怕,据我所知。
    • 感谢您的回答
    • 为了清楚起见,迁移按照它们的创建顺序运行。您将看到每个迁移文件的文件名开头都有一个日期/时间。在创建所需表后设置的迁移文件中设置外键;在设置所有创建的表迁移后创建单独的迁移,或重新排序与迁移文件关联的时间戳(尽管不建议这样做 - 而是重新开始)。
    【解决方案2】:

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

    创建PostsTable

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

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 2011-09-18
      • 2016-03-11
      • 2021-01-03
      • 2020-06-05
      • 1970-01-01
      • 2019-01-22
      • 2015-09-22
      相关资源
      最近更新 更多