You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:07