Laravel 8:删除链接到表单的用户时,SoftDeletes 未更新
Laravel 8 : SoftDeletes not updated when deleting a user linked to a form
我在 Laravel 8 上遇到问题,当我删除一个用户时,我的 'deleted_at' 在我的 'user' table 中更新,但 'deleted_at' 我的 'forms' table 因为我想删除链接到该用户的表单,否则我会出错,因为当他不再存在时我会显示他的信息。
请问我该如何解决这个问题?
我在模型中使用了软删除
当我删除表单时 'deleted_at' 会更新。
用户迁移:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('firstname');
$table->string('lastname');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->foreignId('current_team_id')->nullable()->onDelete('cascade');
$table->string('profile_photo_path', 2048)->nullable();
$table->timestamps();
$table->foreignId('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->softDeletes();
});
}
public function down()
{
Schema::dropIfExists('users', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
表单迁移:
public function up()
{
Schema::create('forms', function (Blueprint $table) {
$table->id();
$table->string('title', 100);
$table->text('message');
$table->datetime('date');
$table->string('color');
$table->softDeletes();
$table->timestamps();
});
}
public function down()
{
// Schema::dropIfExists('forms');
Schema::table('forms', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
将用户添加到表单迁移:
public function up()
{
Schema::table('forms', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::table('forms', function (Blueprint $table) {
$table->dropForeign('user_id')->onDelete('cascade');
});
}
软删除不适用于级联外键。级联外键是 sql
服务器的一项功能,软删除是 laravel
的一项功能,需要 laravel
上下文才能工作。
删除它时,要使软删除起作用,您需要在关系的每个模型上调用 delete。这对于集合和高阶函数来说非常容易。
{
$user = User::firstOrFail($id);
$user->forms->each->delete();
$user->delete();
...
}
非常感谢mrhn,
多亏了你,我学到了很多东西!
对于那些想要控制器中的功能的人来说,这使得删除用户所属的用户成为可能,因此也删除了与他相关的内容,在我的情况下,一个表单(模型中的功能用于实体之间的基数):
public function destroy($id)
{
// $users = User::findOrFail($id);
// $users->delete();
$user = User::findOrFail($id);
$user->forms->each->delete();
$user->delete();
return redirect()->route('admin');
}
- findOrFail 而不是 firstOrFail ^^'
我在 Laravel 8 上遇到问题,当我删除一个用户时,我的 'deleted_at' 在我的 'user' table 中更新,但 'deleted_at' 我的 'forms' table 因为我想删除链接到该用户的表单,否则我会出错,因为当他不再存在时我会显示他的信息。 请问我该如何解决这个问题?
我在模型中使用了软删除 当我删除表单时 'deleted_at' 会更新。
用户迁移:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('firstname');
$table->string('lastname');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->foreignId('current_team_id')->nullable()->onDelete('cascade');
$table->string('profile_photo_path', 2048)->nullable();
$table->timestamps();
$table->foreignId('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->softDeletes();
});
}
public function down()
{
Schema::dropIfExists('users', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
表单迁移:
public function up()
{
Schema::create('forms', function (Blueprint $table) {
$table->id();
$table->string('title', 100);
$table->text('message');
$table->datetime('date');
$table->string('color');
$table->softDeletes();
$table->timestamps();
});
}
public function down()
{
// Schema::dropIfExists('forms');
Schema::table('forms', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
将用户添加到表单迁移:
public function up()
{
Schema::table('forms', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::table('forms', function (Blueprint $table) {
$table->dropForeign('user_id')->onDelete('cascade');
});
}
软删除不适用于级联外键。级联外键是 sql
服务器的一项功能,软删除是 laravel
的一项功能,需要 laravel
上下文才能工作。
删除它时,要使软删除起作用,您需要在关系的每个模型上调用 delete。这对于集合和高阶函数来说非常容易。
{
$user = User::firstOrFail($id);
$user->forms->each->delete();
$user->delete();
...
}
非常感谢mrhn, 多亏了你,我学到了很多东西!
对于那些想要控制器中的功能的人来说,这使得删除用户所属的用户成为可能,因此也删除了与他相关的内容,在我的情况下,一个表单(模型中的功能用于实体之间的基数):
public function destroy($id)
{
// $users = User::findOrFail($id);
// $users->delete();
$user = User::findOrFail($id);
$user->forms->each->delete();
$user->delete();
return redirect()->route('admin');
}
- findOrFail 而不是 firstOrFail ^^'