Laravel模型预加载时使用其他模型字段作为匹配条件查询求助
Laravel关联条件筛选实现方案
分两种常见业务场景给出实现代码:
场景1:保留当前Haul查询结果,仅过滤符合条件的关联数据
即ID为1的Haul无论是否存在符合条件的关联都会返回,只是vehicles和bids关联仅返回满足vehicles.driver_id = bids.driver_id的记录,无匹配时关联字段为空。
$res = Haul::with([ 'vehicles' => function ($query) { $query->whereColumn('vehicles.driver_id', 'bids.driver_id'); }, 'bids' => function ($query) { $query->whereColumn('bids.driver_id', 'vehicles.driver_id') ->with('driver'); } ]) ->join('bids', 'bids.haul_id', '=', 'hauls.id') ->join('haul_vehicle', 'haul_vehicle.haul_id', '=', 'hauls.id') ->join('vehicles', 'vehicles.id', '=', 'haul_vehicle.vehicle_id') ->select('hauls.*') // 避免关联表字段覆盖Haul本身字段 ->find(1);
场景2:仅当存在符合条件的关联时才返回Haul数据
即如果ID为1的Haul没有满足vehicles.driver_id = bids.driver_id的关联记录,整体查询返回null。
$res = Haul::with([ 'vehicles' => function ($query) { $query->whereColumn('vehicles.driver_id', 'bids.driver_id'); }, 'bids' => function ($query) { $query->whereColumn('bids.driver_id', 'vehicles.driver_id') ->with('driver'); } ]) // 校验存在符合条件的关联 ->whereHas('vehicles', function ($query) { $query->whereColumn('vehicles.driver_id', 'bids.driver_id'); }) ->join('bids', 'bids.haul_id', '=', 'hauls.id') ->join('haul_vehicle', 'haul_vehicle.haul_id', '=', 'hauls.id') ->join('vehicles', 'vehicles.id', '=', 'haul_vehicle.vehicle_id') ->select('hauls.*') ->find(1);
内容的提问来源于stack exchange,提问作者pro guard
相关产品推荐
相关产品推荐

