
本文讲解 laravel 使用 db::select() 查询后误将对象数组当作字符串处理导致的“expected type 'string'. found 'array'”错误,重点说明如何正确提取字段值并转换为字符串数组。
本文讲解 laravel 使用 db::select() 查询后误将对象数组当作字符串处理导致的“expected type 'string'. found 'array'”错误,重点说明如何正确提取字段值并转换为字符串数组。
在 Laravel 中,DB::select() 方法执行原生 SQL 查询后,返回的是一个包含 stdClass 对象的数组(即 array),而非字符串。因此,当你直接对 $rooms_db 调用 explode(',', $rooms_db) 时,PHP 会报错:Expected type 'string'. Found 'array' —— 因为 explode() 仅接受字符串作为第二个参数,而你传入的是一个对象数组。
你的原始代码存在两个关键问题:
- ❌ 错误地将查询结果(数组)当作字符串传给 explode();
- ❌ SQL 中使用字符串拼接('$checkin_date')存在 SQL 注入风险,且语法不严谨(日期比较应使用参数绑定)。
✅ 正确做法是:
- 使用 Laravel 的参数化查询防止注入;
- 遍历查询结果,提取每个对象的 room_number 属性;
- 将其映射为纯字符串数组。
以下是修复后的完整代码示例:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
// ✅ 安全、规范的写法(推荐)
$rooms_db = DB::select(
"SELECT room_number FROM bookings WHERE ? BETWEEN checkin_date AND checkout_date",
[$checkin_date]
);
// ✅ 提取所有 room_number 字段值,生成字符串数组
$rooms_arr = array_map(fn($item) => (string) $item->room_number, $rooms_db);
return response()->json(['data' => $rooms_arr]);? 补充说明:
- array_map() 遍历 $rooms_db 中每个对象,取出 ->room_number 并强转为字符串,确保结果为纯净的 string[];
- 使用 ? 占位符 + 参数数组([$checkin_date])替代字符串拼接,彻底规避 SQL 注入;
- 若需进一步去重或过滤空值,可链式调用:
$rooms_arr = array_values( // 重置键名 array_filter( // 过滤空/无效值 array_map(fn($item) => $item->room_number ?? '', $rooms_db) ) );
⚠️ 注意事项:
- 不要对数据库查询结果直接 explode() 或 json_encode() 后再解析——先明确数据结构;
- 开发中建议开启 Laravel 的严格模式(如 APP_DEBUG=true)并配合 IDE 类型提示(如 Intelephense),能更早发现类型不匹配问题;
- 如需更简洁的写法,也可改用 Eloquent 模型查询:
$rooms_arr = Booking::whereBetween('checkin_date', [$checkin_date, $checkin_date]) ->pluck('room_number') ->toArray();
通过理解 DB::select() 的返回结构并选用合适的数据提取方式,即可彻底解决该类型错误,并写出更安全、可维护的 Laravel 代码。

















