【问题标题】:Add "ON DELETE CASCADE" to existing column in Laravel在 Laravel 的现有列中添加“ON DELETE CASCADE”
【发布时间】:2015-01-05 09:33:47
【问题描述】:

我的表中有 user_id fk 列

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

我应该将级联删除功能添加到这个现有的列。我该怎么做?

【问题讨论】:

  • 使用原始查询DB::statement('..')。你的桌子叫什么名字?
  • 表格名称为“answers”

标签: php laravel laravel-4 database-migration


【解决方案1】:
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

【讨论】:

  • [Illuminate\Database\QueryException] SQLSTATE[HY000]: 一般错误: 1005 Can't create table 'xxx.#sql-5d7_226' (errno: 121) (SQL: alter table xxx添加约束answers_user_id_foreign外键(user_id )引用usersid)删除级联)
  • 那也许你应该把它报告为一个bug,因为那是官方的documented method
【解决方案2】:

Laravel 模式构建器无法修改当前状态的列,因此您将使用原始查询。您将不得不删除并重新创建 约束

PostgreSQL

function up()
{
    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );
}
function down()
{
    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );
}

MySQL

function up()
{
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );
}
function down()
{
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );
}

【讨论】:

    【解决方案3】:
    $table->integer('user_id')->unsigned();    
    $table->foreign('user_id')
          ->references('id')->on('users')
          ->onDelete('cascade');
    

    我假设您使用Illuminate\Database\Schema\Blueprint::primary() 创建users.id。如果是这种情况,那么 users.id 将是未签名的。因此,您的外键列 user_id 也必须是无符号的。

    【讨论】:

      【解决方案4】:

      先删除外键。感谢Razor 的提示

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

      【讨论】:

      • @BrentConnor 如果它已经迁移并投入生产,是的。否则,您可以回滚迁移,编辑原始文件,然后再次迁移。
      • 至少在 laravel 5.7 中的 $table->dropForeign('answers_user_id_foreign');必须是:$table->dropForeign(['template_id']);
      • 更短,删除外键时不需要知道命名约定:$table->dropForeign(['user_id'])
      • 如果我们删除外键,这些列或表上的数据会发生什么?
      • @PrafullaKumarSahu 您只是在删除外键定义。您不会丢失任何数据。
      【解决方案5】:

      感谢您的问题回答。帮助我在 L5.1 中找到这个工作代码:

      public function up()
      {
          Schema::table('transactions', function (Blueprint $table) {
              $table->dropForeign('transactions_order_id_foreign');
              $table->foreign('order_id')
                  ->references('id')->on('orders')
                  ->onDelete('cascade')
                  ->change();
          });
      
          Schema::table('orders', function (Blueprint $table) {
              $table->dropForeign('orders_user_id_foreign');
              $table->foreign('user_id')
                  ->references('id')->on('users')
                  ->onDelete('cascade')
                  ->change();
          });
      }
      

      【讨论】:

        【解决方案6】:

        在我的情况下,我需要将 col 名称放在一个数组中,否则会出错。

        Schema::table('transactions', function (Blueprint $table) {
            $table->dropForeign(['transactions_order_id_foreign']);
            $table->foreign('order_id')
                ->references('id')->on('orders')
                ->onDelete('cascade')
                ->change();
        });
        

        mysql 5.7 版本

        【讨论】:

        • $table->dropForeign(['tank_id']); $table->foreign('tank_id')->references('id')->on('tanks')->onDelete('cascade')->change();
        【解决方案7】:

        在当前迁移中使用无符号函数user_id

        $table->interger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');
        

        【讨论】:

          【解决方案8】:

          小代码

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

          【讨论】:

            猜你喜欢
            • 2016-09-28
            • 2012-07-16
            • 1970-01-01
            • 2020-06-20
            • 2010-12-06
            • 2019-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多