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
相关产品推荐
相关产品推荐

