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
相关产品推荐
相关产品推荐

