Laravel中explode报Expected type 'string' Found 'array'(1006)错误
报错原因
你触发Expected type 'string'. Found 'array'.intelephense(1006)报错的核心原因是参数类型不匹配:
- Laravel中
DB::select()执行查询后,返回的结果是由查询记录组成的数组,每条记录为包含对应字段的对象或关联数组,并非你预期的逗号拼接的字符串值 explode()函数的第二个参数要求传入字符串类型,你直接把查询返回的数组传入,不符合函数的参数规则,因此静态检测工具和运行时都会抛出错误
解决方案
根据你数据库中room_number字段的存储格式,选择对应写法即可:
场景1:每条记录的room_number存储单个房间号(常规表设计)
这种场景不需要调用explode(),直接提取查询结果中的room_number字段即可,同时建议改用参数绑定传值,避免SQL注入风险:
// 用参数绑定传入查询日期,避免SQL注入 $rooms_db = DB::SELECT( "SELECT room_number FROM bookings WHERE ? BETWEEN checkin_date AND checkout_date", [$checkin_date] ); // 提取所有记录的room_number字段组成一维数组 $room_arr = array_column($rooms_db, 'room_number'); return response()->json(['data' => $room_arr]);
如果用Laravel查询构造器可以写得更简洁:
$room_arr = DB::table('bookings') ->where('checkin_date', '<=', $checkin_date) ->where('checkout_date', '>=', $checkin_date) ->pluck('room_number') ->toArray(); return response()->json(['data' => $room_arr]);
场景2:room_number字段存储逗号拼接的多个房间号(不推荐的表设计)
这种场景需要遍历查询结果,对每条记录的room_number字符串单独做拆分,再合并为最终的房间号数组:
$rooms_db = DB::SELECT( "SELECT room_number FROM bookings WHERE ? BETWEEN checkin_date AND checkout_date", [$checkin_date] ); $room_arr = []; foreach ($rooms_db as $record) { // 拆分单条记录里的逗号拼接房间号,合并到结果数组 $room_arr = array_merge($room_arr, explode(',', $record->room_number)); } // 可选:去重避免重复的房间号 $room_arr = array_unique($room_arr); return response()->json(['data' => $room_arr]);
注意:不要直接把PHP变量拼接进SQL语句,这种写法存在严重的SQL注入风险,无论使用哪种查询方式,都优先用参数绑定的方式传入动态查询值。
内容的提问来源于stack exchange,提问作者nadeesha
相关产品推荐
相关产品推荐

