PHP如何向包含对象的数组中添加新属性
解决PHP中为Eloquent集合对象添加新属性的问题
问题分析
你当前代码存在两个核心问题:
DB::get()返回的是Eloquent集合对象,集合中的每个元素是stdClass或Eloquent模型实例,并非普通数组,因此不能用array_push操作对象。$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
相关产品推荐
相关产品推荐

