Laravel外键onDelete('cascade')无效

Ali*_*ias 7 sql foreign-key-relationship laravel eloquent

我在用户和角色之间存在多对多关系,并且有一个role_user表.我的迁移设置如此(简化):

users 表:

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

roles 表:

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

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');
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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

我究竟做错了什么?

  • MySQL + InnoDB

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

Jak*_*ake 15

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

$table->engine = 'InnoDB';
Run Code Online (Sandbox Code Playgroud)

我已经提交了一个错误:https://github.com/laravel/framework/issues/8730


Shr*_*hal 9

Jake 的回答表明您已将默认引擎设置为 InnoDB

$table->engine = 'InnoDB';
Run Code Online (Sandbox Code Playgroud)

而不是在每个迁移文件中这样做,你可以这样做 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',
    ],
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

$table->foreignId('user_id')->constrained()->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)


STW*_*son 5

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