Laravel:如何将Eloquent集合循环转为另一集合?仅获取首条数据
问题分析与解决办法
嘿,我一眼就看出问题啦!你现在的代码之所以最后只输出一条数据(其实是循环里的最后一条,不是第一条哦),核心原因是:你只创建了单个Students模型实例,循环过程中一直在覆盖这个实例的属性,最后自然只能保留最后一次赋值的结果,根本没生成集合。
正确的实现方式
方法1:手动创建集合并添加实例
先初始化一个空集合,然后在循环里为每个学生新建模型实例,再把实例加入集合:
$queries = Students::where('year', 1)->get(); $students = collect(); // 创建空的集合对象 foreach ($queries as $query) { // 每次循环都新建一个Students实例 $student = new Students(); $student->name = $query->name; $student->faculty = $query->faculty . "Add something"; $student->year = $query->year; $students->push($student); // 将当前实例加入集合 } dd($students);
方法2:用集合的map()方法(更优雅)
Eloquent集合自带map()方法,可以直接对集合里的每个元素进行转换,代码更简洁:
$students = Students::where('year', 1)->get()->map(function ($query) { $student = new Students(); $student->name = $query->name; $student->faculty = $query->faculty . "Add something"; $student->year = $query->year; return $student; }); dd($students);
额外选项:如果不需要模型实例,直接返回数组集合
如果只是需要包含转换后数据的集合,不需要完整的模型实例,可以直接返回数组:
$students = Students::where('year', 1)->get()->map(function ($query) { return [ 'name' => $query->name, 'faculty' => $query->faculty . "Add something", 'year' => $query->year ]; });
再唠两句原代码的问题
你原来的$students = new Students();只执行了一次,相当于只造了一个“学生容器”,每次循环都是把新数据倒进这个容器里,旧数据自然就被覆盖了。只有每次循环都新建容器,再把所有容器放进集合里,才能得到所有转换后的学生数据~
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

