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

Laravel 8集合转数组异常:created_schedule转换问题

Laravel 8 日程集合转数组后关联数据仍为集合的解决方法

问题描述

在Laravel 8的该方法中,通过一次查询获取了STATUS_PUBLISHED和STATUS_DRAFT状态的日程数据,过滤后调用toArray()转换时,发现created_schedule和published_schedule中的每条记录的关联数据(如organizations、routes等)依然是集合格式,而非预期的纯数组。

解决思路

问题根源在于:filter返回的是Eloquent集合,直接调用toArray()仅将外层集合转为数组,但内部的Eloquent模型及其关联并未完全转为纯数组。需要确保每个模型及其关联都被转换为数组格式。

具体解决方案

方案1:遍历转换每个模型

在过滤后,使用map方法遍历集合,将每个Schedule模型及其关联统一转为数组:

$published = $schedules->filter(function ($schedule) {
    return $schedule->status === Schedule::STATUS_PUBLISHED;
})->map(function($item) {
    return $item->toArray();
})->toArray();

$created = $schedules->filter(function ($schedule) {
    return $schedule->status === Schedule::STATUS_DRAFT;
})->map(function($item) {
    return $item->toArray();
})->toArray();

方案2:使用groupBy简化分组逻辑

既然已经一次查询出所有符合条件的日程,直接用groupBy按状态分组,避免两次重复过滤,代码更简洁高效:

$scheduleGroups = $schedules->groupBy('status');
// 若对应状态无数据,返回空数组
$published = $scheduleGroups->get(Schedule::STATUS_PUBLISHED, collect())->map(fn($item) => $item->toArray())->toArray();
$created = $scheduleGroups->get(Schedule::STATUS_DRAFT, collect())->map(fn($item) => $item->toArray())->toArray();

修改后的完整代码

public function getOrganizationData(): JsonResponse
{
    $manager = auth('manager')->user();
    try {
        $routes = Route::where('o_id', $manager->o_id)
            ->where('status', Route::STATUS_ACTIVE)
            ->select('id', 'name')
            ->get();

        $vehicles = Vehicle::where('o_id', $manager->o_id)
            ->where('status', Vehicle::STATUS_ACTIVE)
            ->select('id', 'number as name')
            ->get();

        $drivers = Driver::where('o_id', $manager->o_id)
            ->where('status', Driver::STATUS_ACTIVE)
            ->select('id', 'name')
            ->get();

        $schedules = Schedule::with(['organizations:id,name', 'routes:id,name,number,from,to', 'vehicles:id,number', 'drivers:id,name'])
            ->where('o_id', $manager->o_id)
            ->whereDate('date', date('Y-m-d'))
            ->whereIn('status', [Schedule::STATUS_PUBLISHED, Schedule::STATUS_DRAFT])
            ->select('id', 'o_id', 'route_id', 'v_id', 'd_id', 'date', 'time', 'status', 'created_at')
            ->get();

        // 按状态分组并转换为纯数组
        $scheduleGroups = $schedules->groupBy('status');
        $published = $scheduleGroups->get(Schedule::STATUS_PUBLISHED, collect())->map(fn($item) => $item->toArray())->toArray();
        $created = $scheduleGroups->get(Schedule::STATUS_DRAFT, collect())->map(fn($item) => $item->toArray())->toArray();

        $data = [
            'routes' => $routes,
            'vehicles' => $vehicles,
            'drivers' => $drivers,
            'published_schedule' => $published,
            'created_schedule' => $created
        ];
    } catch (ModelNotFoundException $e) {
        throw new NotFoundHttpException('数据未找到:' . $e->getMessage());
    }

    return $this->respondWithSuccess(
        $data,
        '组织路线、车辆、司机数据及已发布/待发布日程',
        'ORGANIZATION_ROUTE_VEHICLE_DRIVER_DATA_SCHEDULE'
    );
}

内容的提问来源于stack exchange,提问作者Arslan Mughal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:43:14