You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Soft Deletes已实现但列表仍显示已删除用户的问题

解决Laravel软删除后查询列表仍显示已删除用户的问题

看起来你已经搞定了软删除的基础功能(调用delete()时deleted_at和updated_at能正确更新),但查询列表时还能看到已删除用户,这个问题其实是Laravel软删除的一个常见小坑——我来帮你快速解决:

1. 核心原因:模型未启用软删除自动过滤

Laravel的软删除不会自动帮你过滤已删除记录,除非你的User模型正确引入了SoftDeletes trait。这个trait会给模型添加一个全局作用域,自动在所有默认查询中排除deleted_at不为null的记录。

修正User模型代码

打开你的User模型,确保添加以下内容:

<?php

namespace App\Models; // 根据你的实际命名空间调整

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes; // 关键:引入软删除Trait

    // 其他模型代码,比如$fillable、关联关系等...
}

添加这个trait后,你用User::get()、User::all()或者其他默认查询时,就会自动排除已删除的用户了。

2. 检查查询列表的代码

如果你的User模型已经加了SoftDeletes,但还是能看到已删除用户,那可能是你在查询列表时主动取消了过滤:

  • 如果你写了User::withTrashed()->get():这个方法会显式获取所有记录,包括已删除的,去掉withTrashed()即可。
  • 如果你手动写了复杂的where条件,不小心覆盖了全局作用域:可以手动加上过滤条件兜底:
    $users = User::whereNull('deleted_at')->get();
    

3. 优化你的删除逻辑(额外建议)

另外,你代码里循环更新Policy的部分可以优化一下,不用逐条循环保存,直接批量更新更高效:

// 替换原来的foreach循环
Policy::where('user_id', $user_id)->update(['user_id' => 0]);

总结

最可能的问题就是User模型没引入SoftDeletes trait,加上之后默认查询就会自动过滤已删除用户了。如果还是有问题,检查一下查询列表的代码有没有主动包含已删除记录的逻辑。

内容的提问来源于stack exchange,提问作者user3892232

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:29