Laravel外键onDelete(' cascade')无效

时间:2014-07-22 20:34:25

标签: sql laravel eloquent foreign-key-relationship

用户与用户之间有多对多的关系。角色,带有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');
    });
}

因此,根据文档,我将外键设置为unsigned。

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

我做错了什么?

  • MySQL + InnoDB

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

6 个答案:

答案 0 :(得分:14)

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

$table->engine = 'InnoDB';

我已在https://github.com/laravel/framework/issues/8730

下提交了一个错误

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

我通过在关系上使用constrained()选项解决了它。没有“ constrained”参数,迁移将不会在数据库上创建实际的关系。

$table->foreignId('user_id')->constrained()->onDelete('cascade');

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

即使在Config-> Database中将引擎更改为InnoDB之后 它不起作用

解决方案是更改迁移

来自

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

收件人

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

答案 5 :(得分:0)

根据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',
    ],