laravel migration best way to add foreign key

后端 未结 10 1063
梦毁少年i
梦毁少年i 2020-12-09 09:19

Simple question: I\'m new to Laravel. I have this migration file:

Schema::create(\'lists\', function(Blueprint $table) {
    $table->increments(\'id\'); 
         


        
相关标签:
10条回答
  • 2020-12-09 09:50
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    

    In this example, we are stating that the user_id column references the id column on the users table. Make sure to create the foreign key column first! The user_id column is declared unsigned because it cannot have negative value.

    You may also specify options for the "on delete" and "on update" actions of the constraint:

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

    To drop a foreign key, you may use the dropForeign method. A similar naming convention is used for foreign keys as is used for other indexes:

    $table->dropForeign('posts_user_id_foreign');
    

    If you are fairly new to Laravel and Eloquent, try out the Laravel From Scratch series available on laracasts. It is a great guide for beginners.

    0 讨论(0)
  • 2020-12-09 09:51

    You should create a new migration file let's say 'add_user_foreign_key.php'

    public function up()
    {
        Schema::table('lists', function(Blueprint $table)
        {
             $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }
    
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('lists', function(Blueprint $table)
        {
        $table->dropForeign('user_id'); //
        });
    }  
    

    The run

     php artisan migrate
    
    0 讨论(0)
  • 2020-12-09 09:54

    Firstly you have to make your user_id field an index:

    $table->index('user_id');
    

    After that you can create a foreign key with an action on cascade:

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

    If you want to do that with a new migration, you have to remove the index and foreign key firstly and do everything from scratch.

    On down() function you have to do this and then on up() do what I've wrote above:

    $table->dropForeign('lists_user_id_foreign');
    $table->dropIndex('lists_user_id_index');
    $table->dropColumn('user_id');
    
    0 讨论(0)
  • 2020-12-09 09:55

    If you want to add onDelete('cascade') on the existing foreign key, just drop the indexes and create them again:

    public function up()
    {
        Schema::table('lists', function($table)
        {
            $table->dropForeign('lists_user_id_foreign');
    
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }
    
    public function down()
    {
        Schema::table('lists', function($table)
        {
            $table->dropForeign('lists_user_id_foreign');
    
            $table->foreign('user_id')->references('id')->on('users');
        });
    }
    
    0 讨论(0)
  • 2020-12-09 09:59

    I was doing the same but got error " id not exist" => so I changed my migration file as below :

    question table migration content:

    $table->id() => should change to $table->increments('id')

    definitions of foreign key in Reply table:

    $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');

    now your foreign key will work.

    0 讨论(0)
  • 2020-12-09 10:00

    In Laravel 7 it can be done in one line

    $table->foreignId('user_id')->constrained()->cascadeOnDelete();

    0 讨论(0)
提交回复
热议问题