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

Laravel 8关联查询:为公司列表添加用户合同关联标记字段

解决方案

你可以通过子查询判断存在性或左关联+条件标记来实现需求,既保留原有公司数据,又新增布尔字段标记当前用户的合同关联情况,具体两种实现方式如下:

方式一:使用Exists子查询(推荐)

这种方式SQL执行效率更高,适合数据量较大的场景:

$userId = auth()->id();

$companies = Company::select('id', 'name')
    ->selectRaw('EXISTS(SELECT 1 FROM contracts WHERE contracts.company_id = companies.id AND contracts.user_id = ?) AS hasLastInsertedData', [$userId])
    ->get();

查询返回的hasLastInsertedData字段会直接以布尔值(true/false)形式呈现,标记当前用户是否用该公司创建过合同。

方式二:使用左关联+Case语句

如果更习惯关联查询的写法,可以用左连接配合条件判断:

$userId = auth()->id();

$companies = Company::select('companies.id', 'companies.name')
    ->selectRaw('CASE WHEN contracts.id IS NOT NULL THEN 1 ELSE 0 END AS hasLastInsertedData')
    ->leftJoin('contracts', function ($join) use ($userId) {
        $join->on('contracts.company_id', '=', 'companies.id')
             ->where('contracts.user_id', '=', $userId);
    })
    ->groupBy('companies.id', 'companies.name')
    ->get();

这里通过分组避免因用户对应多个合同导致公司数据重复,返回的hasLastInsertedData为1或0,可根据需求转为布尔值使用。

注意事项

  • 确保auth()->id()能正确获取当前认证用户ID,若存在未登录场景,可提前判断并给$userId赋值默认值(比如0),此时所有公司的标记字段都会返回false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:03:11