Laravel pluck多列异常:如何获取正确的name与score用于图表
Laravel: 获取多列数据用于图表,避免pluck重复键覆盖问题
嘿,这个问题我之前也碰到过!Laravel的pluck在处理重复键的时候确实容易踩坑,尤其是当你想用它同时获取两个字段但第二个字段存在重复值的时候。先帮你理清楚之前两种写法的问题所在:
问题分析
- 第一种写法只
pluck('name'),返回的集合里只有name字段的值,循环时的$key其实是集合的索引值,自然拿不到数据库里真实的score; - 第二种
pluck('name', 'score')把score作为集合的键,但因为你数据库里所有记录的score都是25,而集合的键是唯一的,每一条新数据都会覆盖之前键为25的条目,最后就只剩最后一条记录了。
解决方案
下面给你几种靠谱的实现方式,都能完美获取所有名称和对应的正确score:
方法1:select + get + 遍历(最直观)
先通过select指定要获取的字段,用get()拿到完整的模型集合,再遍历组装成你需要的格式:
// 获取指定字段的所有记录 $corporateObjectives = CorporateObjective::select('name', 'score')->get(); $corporateObjective = []; foreach($corporateObjectives as $obj) { $corporateObjective[] = [$obj->name, '('.$obj->score.'%)']; }
方法2:使用集合map方法(更简洁优雅)
利用Laravel集合的map方法链式处理,省去单独的foreach循环:
$corporateObjective = CorporateObjective::select('name', 'score') ->get() ->map(function ($item) { return [$item->name, '('.$item->score.'%)']; }) ->toArray();
方法3:pluck多字段(可选)
如果你还是想用pluck,可以传递字段数组来获取包含多个字段的集合,再处理:
$items = CorporateObjective::pluck(['name', 'score']); $corporateObjective = $items->map(function ($item) { return [$item['name'], '('.$item['score'].'%)']; })->toArray();
以上几种方法都能返回你需要的完整数据,比如:
"xAxis": [ [ "PEOPLE DEVELOPMENT", "(25%)" ], [ "OPTIMUM SYSTEMS AND PROCESSES", "(25%)" ], [ "CUSTOMER MANAGEMENT", "(25%)" ], [ "REVENUE GROWTH", "(25%)" ] ]
内容的提问来源于stack exchange,提问作者Jim E Russel
相关产品推荐
相关产品推荐

