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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:02:27