Sql Laravel外键onDelete(';级联';)不工作

Sql Laravel外键onDelete(';级联';)不工作,sql,laravel,eloquent,foreign-key-relationship,Sql,Laravel,Eloquent,Foreign Key Relationship,我在用户和角色之间有一个多对多关系,有一个Role\u User表。我的迁移设置如下(简化): 用户表格: public function up() { Schema::create('users', function(Blueprint $table) { $table->increments('id'); $table->string('email')->unique(); }); } public function

我在用户和角色之间有一个多对多关系,有一个Role\u User表。我的迁移设置如下(简化):

用户
表格:

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('email')->unique();
    });
}
public function up()
{
    Schema::create('roles', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');
    });
}
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');
    });
}
角色
表格:

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('email')->unique();
    });
}
public function up()
{
    Schema::create('roles', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');
    });
}
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');
    });
}
role\u用户
表格:

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('email')->unique();
    });
}
public function up()
{
    Schema::create('roles', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name');
    });
}
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\u user
表中该用户的行不会被删除,这会导致冗余行

我做错了什么

  • MySQL+InnoDB

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

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

$table->engine = 'InnoDB';

我在下面提交了一个bug:

检查MySQL配置my.ini可能仍有
默认存储引擎=MYISAM
。设置为
default storage engine=InnoDB
,即使在Config->Database中将引擎更改为
InnoDB
后,也应该避免在每次迁移中添加此修复程序的麻烦。

它不起作用

解决方法是改变迁移

Schema::create('users',函数(Blueprint$表){
$table->BIG增量('id');

Schema::create('users',函数(Blueprint$表){

$table->increments('id');

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

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

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

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

对于在此处并在其型号上使用
SoftDeletes
的用户;
onDelete('cascade')
功能在使用SoftDeletes时会丢失。在这种情况下,您可以使用的选项有:

  • 使用包为您处理此问题
  • 用于触发父行已被删除的事件,并自行处理子行的删除

  • 您是否在MySQL中创建了关系?请在PHPMyAdmin等软件中检查您的表结构。同时尝试删除
    $table->integer('user_id')->unsigned();
    我已经安装了PHPMyAdmin-我在哪里查看关系?将有一个gander。这可能没有任何帮助。混乱…迁移过程中不会抛出错误。好的,我手动设置了
    $table->engine='InnoDB';
    现在它工作了,即使在“type”下面写着“InnoDB”DB中的列。怪异。发生此问题的原因很可能是MySQL实例中的默认表引擎设置为MyISAM,而MyISAM不支持外键。尝试在MyISAM表上使用外键在Laravel中绝对不会是一个错误。不过,如果架构生成器能够自动将引擎设置为in,那将是一件好事noDB如果使用外键。请确保将其添加到所有迁移中,否则它将不起作用。在Windows&WAMP下的本地开发计算机上更改
    my.ini
    后,不要忘记重新启动WAMP服务(左键单击任务栏图标并选择重新启动所有服务)要添加到Shreyans的答案中,这会更快,但您需要重新启动localhost:8000,然后运行
    php artisan migrate:fresh
    当然,首先备份数据。我真的不认为将
    BigIncrements
    更改为
    increments
    是一个理想的答案。bigInteger方法会创建一个
    BIGINT
    等效的cocolumn和
    increments
    方法创建一个自动递增的无符号整数等效列作为主键。感谢您的评论,saved me:-)