Laravel关联查询报错:Method name must be a string 求助解决
问题解决:Laravel预加载关联报错「Method name must be a string」
错误原因
你调用with()方法的格式有误:with('vehicle', ['vehicle.activeTrip' => ...])这种写法会把第二个数组参数当成vehicle关联的回调函数,但Laravel期望回调是闭包而非数组,因此触发了「方法名必须是字符串」的错误。
正确写法
写法一:嵌套预加载数组
把需要预加载的关联(包括嵌套关联)统一放在一个数组参数里:
$trips = Trip::with(['vehicle.activeTrip' => function ($query) { $query->where('status', 0); }]) ->where('route', $route) ->get() ->pluck('vehicle');
写法二:分层定义预加载
如果需要对vehicle本身添加查询条件,可以分层写闭包:
$trips = Trip::with([ 'vehicle' => function ($vehicleQuery) { // 可选:这里可添加对vehicle表的查询条件 $vehicleQuery->with(['activeTrip' => function ($tripQuery) { $tripQuery->where('status', 0); }]); } ]) ->where('route', $route) ->get() ->pluck('vehicle');
更优查询方案
从业务逻辑来看,你最终要的是「跑过指定路线的车辆+车辆的活跃行程」,直接从Vehicle模型出发查询更高效,避免先查Trip再提取Vehicle的冗余步骤:
$vehicles = Vehicle::whereHas('trips', function ($query) use ($route) { // 筛选出有指定路线行程的车辆 $query->where('route', $route); }) ->with(['activeTrip' => function ($query) { // 预加载车辆的活跃行程 $query->where('status', 0); }]) ->get();
内容的提问来源于stack exchange,提问作者Shah Foyez
相关产品推荐
相关产品推荐

