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

Laravel 9中如何按User表的Team ID筛选Daily Reports表

解决Laravel 9中按team_id筛选daily_report数据的问题

问题场景

我有一个user表(包含team_id字段)和daily_report表(包含user_id字段),想要在Laravel 9中按team_id筛选daily_report的数据。当前控制器的index方法代码如下:

public function index()
{
    $daily_reports = DailyReport::with('user.team')->with('updated_by_user_id')
        ->when(request()->q, function ($daily_reports) {
            $daily_reports = $daily_reports->where('description', 'like', '%' . request()->q . '%');
        })->when(request()->status, function ($daily_reports) {
            $daily_reports = $daily_reports->where('status', request()->status);
        })->when(request()->user_id, function ($daily_reports) {
            $daily_reports = $daily_reports->where('user_id', request()->user_id);
        })->when(request()->team_id, function ($daily_reports) {
            $daily_reports = $daily_reports->where('user.team_id', request()->team_id);
        })->latest()->paginate(5);

    $users = User::all();
    $teams = Team::all();

    return Inertia::render('Apps/DailyReports/Index', [
        'daily_reports' => $daily_reports,
        'users' => $users,
        'teams' => $teams,
    ]);
}

遇到的错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user.team_id' in 'where clause'
select count(*) as aggregate from `daily_reports` where `user`.`team_id` = 2

错误原因

直接用where('user.team_id', ...)的方式不成立,因为Laravel的where方法默认只会操作当前模型对应的表(此处为daily_reports),不会自动关联关联表的字段,必须明确指定关联查询的条件。

解决方案

方法1:使用whereHas关联查询

通过whereHas方法约束关联模型的条件,Laravel会自动处理表关联逻辑:
修改筛选team_id的代码片段为:

->when(request()->team_id, function ($query) {
    $query->whereHas('user', function ($userQuery) {
        $userQuery->where('team_id', request()->team_id);
    });
})

完整的控制器代码更新后如下:

public function index()
{
    $daily_reports = DailyReport::with('user.team')->with('updated_by_user_id')
        ->when(request()->q, function ($query) {
            $query->where('description', 'like', '%' . request()->q . '%');
        })->when(request()->status, function ($query) {
            $query->where('status', request()->status);
        })->when(request()->user_id, function ($query) {
            $query->where('user_id', request()->user_id);
        })->when(request()->team_id, function ($query) {
            $query->whereHas('user', function ($userQuery) {
                $userQuery->where('team_id', request()->team_id);
            });
        })->latest()->paginate(5);

    $users = User::all();
    $teams = Team::all();

    return Inertia::render('Apps/DailyReports/Index', [
        'daily_reports' => $daily_reports,
        'users' => $users,
        'teams' => $teams,
    ]);
}

方法2:使用join关联表查询

如果更习惯原生SQL的join语法,也可以手动关联users表后筛选:

->when(request()->team_id, function ($query) {
    $query->join('users', 'daily_reports.user_id', '=', 'users.id')
          ->where('users.team_id', request()->team_id)
          ->select('daily_reports.*'); // 确保只返回daily_reports表的字段,避免字段冲突
})

方法对比

  • whereHas基于Eloquent关联实现,自动处理关联关系,适合保留Eloquent模型的特性;
  • join是原生SQL风格的关联,性能与whereHas相近,但需要手动指定关联条件和字段选择,避免不同表的字段冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:10:15