如何将Laravel多元素Eloquent Collection转为单元素Collection数组?
解决Laravel Eloquent Collection转单元素Collection数组的问题
嘿,你完全不用重复查询数据库来实现这个需求!这里有两个简单高效的方法,既能保留模型对象的所有特性(比如日期自动转为DateTime),又不会额外消耗数据库资源:
方法一:使用Collection的map方法(推荐)
Laravel的Collection本身就提供了map方法,可以轻松遍历并转换每个元素:
// 先获取多元素的Collection $bs = Booking::where("date", "=", $today)->get(); // 把每个Booking模型包装成单元素Collection,再转成数组 $bs1 = $bs->map(function ($booking) { return collect([$booking]); })->toArray(); // 或者用更简洁的箭头函数(PHP 7.4+支持) $bs1 = $bs->map(fn($booking) => collect([$booking]))->toArray();
这个方法一行核心代码就能搞定,map会遍历原Collection中的每个Booking模型,用collect()把单个模型包装成新的Collection,最后toArray()把外层的Collection转成你需要的数组结构。
方法二:手动循环包装
如果你更习惯用循环的写法,也可以直接在循环里包装模型,同样不需要查库:
$bs = Booking::where("date", "=", $today)->get(); $bs1 = []; foreach ($bs as $booking) { // 把单个模型包装成Collection后加入数组 $bs1[] = collect([$booking]); }
为什么这两种方法可行?
collect()是Laravel的内置辅助函数,它会把传入的单个模型包装成一个Illuminate\Support\Collection对象,和你用Booking::where('id', $id)->get()得到的单元素Collection功能完全一致,保留了模型的所有属性、方法以及Eloquent的特性(比如日期字段自动转换)。- 全程只执行一次数据库查询,性能比重复查库好太多。
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

