web-dev-qa-db-ja.com

laravel外部キーを追加するための最良の移行方法

簡単な質問:Laravelは初めてです。私はこの移行ファイルを持っています:

_Schema::create('lists', function(Blueprint $table) {
    $table->increments('id'); 
    $table->string('title', 255);
    $table->integer('user_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->timestamps();
});
_

onDelete('cascade')を追加して更新したい。

これを行う最良の方法は何ですか?

17
reshma kr

まず、user_idフィールドインデックス:

$table->index('user_id');

その後、カスケードのアクションで外部キーを作成できます。

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

新しい移行でそれを行う場合は、最初にインデックスと外部キーを削除し、最初からすべてを行う必要があります。

Down()関数ではこれを行う必要があり、次にup()関数で上記で記述したことを実行します。

$table->dropForeign('lists_user_id_foreign');
$table->dropIndex('lists_user_id_index');
$table->dropColumn('user_id');
28
Schema::create('roles',function(Blueprint $table){

    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();

});

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

    $table->unsignedBigInteger('role_id');
    $table->foreign('role_id')->references('id')->on('roles');
    $table->string('permission');

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

この例では、user_id列がidを参照していることを示していますusersテーブルの列。最初に外部キー列を作成してください! user_id列は負の値を持つことができないため、符号なしとして宣言されます。

制約の「削除時」および「更新時」アクションのオプションを指定することもできます。

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

外部キーを削除するには、dropForeignメソッドを使用できます。他のインデックスに使用されるのと同様の命名規則が外部キーに使用されます。

$table->dropForeign('posts_user_id_foreign');

LaravelEloquentがかなり初めての場合は、ゼロからのLaravelシリーズはララキャストで利用できます。それは初心者のための素晴らしいガイドです。

4
Rohan

新しい移行ファイルを作成する必要があります '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'); //
    });
}  

実行

 php artisan migrate
3
geoandri

onDelete('cascade')を追加したい場合は、インデックスを削除して再度作成します。

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');
    });
}
1
Tomas Buteler
Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('user_id');

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