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

PHP如何向包含对象的数组中添加新属性

解决PHP中为Eloquent集合对象添加新属性的问题

问题分析

你当前代码存在两个核心问题:

  1. DB::get()返回的是Eloquent集合对象,集合中的每个元素是stdClass或Eloquent模型实例,并非普通数组,因此不能用array_push操作对象。
  2. $num = 1写在循环内部,每次迭代都会重置数值,导致所有对象的sucursal属性值都是SUCURSAL1。

正确实现方式

方式一:foreach循环直接赋值属性

将$num初始化在循环外,直接给对象添加属性:

$data = DB::table('guia_sucursal')
    ->join('colecciones','colecciones.id','=','guia_sucursal.coleccion_id')
    ->join('sucursales','colecciones.sucursal_destino_id','=','sucursales.id')
    ->select('colecciones.id as id','colecciones.titulo as titulo','colecciones.image as url','colecciones.codigo_barra as code_bar','sucursales.nombre as sucursal_destino')
    ->groupBy('guia_sucursal.coleccion_id')
    ->distinct('guia_sucursal.coleccion_id')
    ->get();

$num = 1; // 初始化在循环外
foreach ($data as $coleccion){
    // 直接给对象添加属性
    $coleccion->sucursal = "SUCURSAL".$num;
    $num++;
}

方式二:使用Collection的map方法(更优雅的集合操作)

利用Laravel集合的map方法,结合闭包实现属性添加,同时可以自动处理索引:

$data = DB::table('guia_sucursal')
    ->join('colecciones','colecciones.id','=','guia_sucursal.coleccion_id')
    ->join('sucursales','colecciones.sucursal_destino_id','=','sucursales.id')
    ->select('colecciones.id as id','colecciones.titulo as titulo','colecciones.image as url','colecciones.codigo_barra as code_bar','sucursales.nombre as sucursal_destino')
    ->groupBy('guia_sucursal.coleccion_id')
    ->distinct('guia_sucursal.coleccion_id')
    ->get()
    ->map(function($coleccion, $index) {
        // index从0开始,所以加1
        $coleccion->sucursal = "SUCURSAL".($index + 1);
        return $coleccion;
    });

补充说明

如果需要将对象转为数组,可以在操作后调用$data->toArray(),但通常保持对象形式更符合Laravel的开发习惯。

内容的提问来源于stack exchange,提问作者Aldahir Ruiz Valdez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:55:21