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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:24:00