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 ^^'