用户与用户之间有多对多的关系。角色,带有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
表中该用户的行不会被删除,这会导致冗余行。
我做错了什么?
编辑:抓取模型并应用->delete();
也具有相同的效果。
答案 0 :(得分:14)
尝试创建此表时尝试设置。这个修复对我有用。
$table->engine = 'InnoDB';
下提交了一个错误
答案 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')
功能。在这种情况下可以使用的选项是:
答案 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',
],