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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:05:24