如何用Laravel Collection方法替代循环提取指定字段子集?
Laravel集合提取字段子集的优化方案
场景说明
我有一个从API响应获取的Laravel Collection(以下用数组语法近似表示,实际为object类型的Collection,非本地数据库数据):
$rows = [ [ 'id' => 1, 'name' => 'Sue', 'age' => 23, ], [ 'id' => 2, 'name' => 'Joe', 'age' => 25, ], ];
需要提取字段的子集,原本通过foreach循环实现:
$subset = []; foreach ($rows as $row) { $subset[] = ['name' => $row['name'], 'age' => $row['age']]; }
期望得到的结果为:
$subset = [ [ 'name' => 'Sue', 'age' => 23, ], [ 'name' => 'Joe', 'age' => 25, ], ];
遇到的问题
尝试用Laravel集合的高阶消息语法实现:
$subset = $rows->map->only(['name', 'age']);
但得到的是全为null的Collection,换成常规map调用也出现同样问题,一度以为需要类似multipluck的功能。
最终解决方案
后来确认map->only的写法本身是正确的,问题出在集合中的对象:这些对象虽属于名为Model的类,但并非Laravel Model类的子类或兼容实现,缺少only方法。给该类添加only方法后,问题顺利解决。
内容的提问来源于stack exchange,提问作者Synchro
相关产品推荐
相关产品推荐

