代码之家  ›  专栏  ›  技术社区  ›  Alias

Laravel外键onDelete('cascade')无效

  •  15
  • Alias  · 技术社区  · 11 年前

    我和用户之间有一种多对多的关系;角色,具有Role_user表。我的迁移设置如下(简化):

    users 表格:

    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('email')->unique();
        });
    }
    

    roles 表格:

    public function up()
    {
        Schema::create('roles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
        });
    }
    

    role_user 表格:

    public function up()
    {
        Schema::create('role_user', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->integer('role_id')->unsigned();
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
        });
    }
    

    所以根据文档,我将外键设置为未签名。

    现在,我添加了几个用户,并附加了一些角色-一切都很好。但是,当我删除用户时( User::destroy(2) )中该用户的行 角色用户 表不会被删除,这会导致冗余行。

    我做错了什么?

    • MySQL+InnoDB

    编辑:抓取模型并应用 ->delete(); 也具有相同的效果。

    6 回复  |  直到 11 年前
        1
  •  20
  •   Jake    10 年前

    尝试创建此表时尝试设置。这个修复对我有效。

    $table->engine = 'InnoDB';
    

    我已在以下项下提交了一个错误: https://github.com/laravel/framework/issues/8730

        2
  •  11
  •   Shreyansh Panchal    5 年前

    根据Jake的回答,您已经将默认引擎设置为InnoDB

    $table->engine = 'InnoDB';
    

    您可以在 config/database.php

    'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => 'InnoDB',
        ],
    
        3
  •  5
  •   Udhav Sarvaiya Rodrigo Basilio    6 年前

    检查MySQL配置。 my.ini文件 可能还有 default-storage-engine=MYISAM 。设置为 default-storage-engine=InnoDB 您应该避免在每次迁移中添加此修复程序的麻烦。

        4
  •  5
  •   Sid Benetti    4 年前

    我知道这是一个老问题,但最近(在Laravel 8上)我甚至在使用InnoDB时也遇到了同样的问题。

    我通过对关系使用constrained()选项来解决这个问题。如果没有“约束”参数,迁移将不会在数据库上创建实际关系。

    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    
        5
  •  3
  •   Sammie    4 年前

    对于在这里使用 SoftDeletes 在他们的模型上; onDelete('cascade') 使用SoftDeletes时,功能将丢失。在这种情况下,您可以使用以下选项:

    1. 使用 dyrynda/laravel-cascade-soft-deletes 包为您处理此问题。
    2. 使用 Eloquent Events 以触发父行已被删除的事件,并自行处理子行的删除。
        6
  •  0
  •   Muaath Alhaddad    5 年前

    即使在将发动机改为 InnoDB 在配置->数据库 它不起作用

    解决方案是改变迁移

    从…起

    Schema::create('users', function (Blueprint $table) { $table->BigIncrements('id');

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