Laravel Relationships多关联查询:with方法能否指定各关联的可选ID参数
你提到的第二种传入ID字符串的写法不可行。Laravel 的 with 预加载方法只能接收关联名称字符串、或者「关联名称=>约束闭包」格式的数组作为参数,直接传入1这类数值字符串会被识别为关联名称,运行时会因找不到对应关联抛出异常。
场景1:加载所有Vehicle模型,仅预加载指定ID的关联数据
如果你需要返回所有Vehicle,但是每个Vehicle下只保留ID等于指定值的关联记录,可以用带闭包约束的预加载写法:
Vehicle::with([ 'deliveries' => fn($query) => $query->where('id', 1), 'user' => fn($query) => $query->where('id', 1), 'type' => fn($query) => $query->where('id', 1), 'workOrganization' => fn($query) => $query->where('id', 1), ])->get();
如果关联ID是可选参数,可以动态构建预加载数组,适配传ID和不传ID的场景:
// 定义关联和对应可选ID,没有传ID的项值为null $relationConfig = [ 'deliveries' => $deliveryId ?? null, 'user' => $userId ?? null, 'type' => $typeId ?? null, 'workOrganization' => $workOrgId ?? null, ]; $withParams = []; foreach ($relationConfig as $relationName => $filterId) { if (!is_null($filterId)) { // 传了ID就加约束 $withParams[$relationName] = fn($query) => $query->where('id', $filterId); } else { // 没传ID就加载该关联的所有数据 $withParams[] = $relationName; } } Vehicle::with($withParams)->get();
场景2:仅查询「存在指定ID关联」的Vehicle模型,同时加载关联
如果你需要的是筛选出符合关联ID条件的Vehicle主模型本身,不是仅约束预加载的关联内容,需要搭配whereHas使用:
// 示例:仅返回deliveries关联ID为1、user关联ID为1的Vehicle,同时加载所有关联 Vehicle::whereHas('deliveries', fn($query) => $query->where('id', 1)) ->whereHas('user', fn($query) => $query->where('id', 1)) ->with('deliveries', 'user', 'type', 'workOrganization') ->get();
同样支持动态构建查询条件适配可选ID的场景,只需要在循环中判断ID存在时追加whereHas条件即可。
内容的提问来源于stack exchange,提问作者Veljko Stefanovic
相关产品推荐
相关产品推荐

