Laravel历史页同时展示已完成项目与软删除数据的实现疑问
Laravel 同时展示Done状态项目与软删除项目并保留分页功能
你之前的两种写法都存在问题,导致无法达成需求:
- 第一种写法没有调用
withTrashed(),Laravel默认会自动排除软删除数据,所以orWhereNotNull('deleted_at')根本无法匹配到任何软删除的记录。 - 第二种写法虽然用了
withTrashed(),但仅筛选了status=Done的项目,软删除的非Done项目不会被纳入查询结果。 - 合并两个查询集合的方式会直接导致分页失效——Laravel的分页是基于数据库查询构建器实现的,集合合并属于内存操作,无法生成正确的分页元数据。
正确实现方案
要同时展示「状态为Done的项目」和「所有软删除项目」并保留分页,需要用withTrashed()包含软删除数据,再通过分组条件组合筛选逻辑:
public function index() { $projects = Project::withTrashed() ->where(function ($query) { // 分组确保逻辑是:(状态为Done) OR (已软删除) $query->where('status', 'Done') ->orWhereNotNull('deleted_at'); }) ->orderBy('id', 'desc') ->paginate(5); return view('history', compact('projects')); }
代码说明
withTrashed():开启软删除数据的查询权限,这是获取软删除记录的前提。- 闭包分组条件:避免
orWhere引发的逻辑冲突(即使当前没有其他条件,也建议养成分组的习惯),确保查询逻辑准确匹配需求。 paginate(5):正常生成分页数据,视图中可直接使用Laravel自带的分页组件渲染分页栏。
视图中区分软删除项目
如果需要在页面上区分软删除的项目,可以使用模型的trashed()方法判断:
@foreach($projects as $project) <div class="project-item {{ $project->trashed() ? 'text-muted' : '' }}"> <h4>{{ $project->title }}</h4> @if($project->trashed()) <span class="badge bg-secondary">已删除</span> @endif <p>{{ $project->description }}</p> </div> @endforeach {!! $projects->links() !!}
内容的提问来源于stack exchange,提问作者zyoohwan14
相关产品推荐
相关产品推荐

