Laravel 5.4如何将两个Eloquent查询结果合并为一个对象?
解决Laravel中合并搜索筛选字段集合的问题
看起来你是想把两个不同字段的去重筛选选项整合到一起,方便在Blade模板里分别渲染——之前用array_merge或者直接赋值没成功,主要是因为你原来的$filter0和$filter1是Eloquent集合,而且每个集合里的对象属性不一样(一个带location,一个带about),直接合并会导致循环时出现属性缺失的问题。
下面给你两种可行的解决方案,推荐第一种,因为结构更清晰,更符合模板的使用场景:
方案一:将筛选项按字段分组存储(推荐)
我们可以把location和about的选项分别存到$filters的两个键下,这样模板里可以直接针对不同字段循环:
后端代码修改
$arrOfTags = explode(',', $request['position']); // 获取去重的location集合(用pluck直接提取字段值,简化循环) $locations = Cv::select('location') ->whereIn('position', $arrOfTags) ->groupBy('location') ->get() ->pluck('location'); // 获取去重的about集合 $abouts = Cv::select('about') ->whereIn('position', $arrOfTags) ->groupBy('about') ->get() ->pluck('about'); // 组装成结构化的filters数组 $filters = [ 'locations' => $locations, 'abouts' => $abouts ];
Blade模板修改
现在可以分别循环两个分组的选项,代码更直观:
{{-- 渲染location复选框 --}} @foreach($filters['locations'] as $location) <li> <input type="checkbox" name="location" value="{{ $location }}"/> <span> {{ $location }} </span> </li> @endforeach {{-- 渲染about复选框 --}} @foreach($filters['abouts'] as $about) <li> <input type="checkbox" name="about" value="{{ $about }}"/> <span> {{ $about }} </span> </li> @endforeach
方案二:合并为统一结构的集合(不推荐,仅作参考)
如果你一定要把两个字段的选项合并到同一个集合里,可以用map方法把每个对象转换成统一结构,再合并:
后端代码
$arrOfTags = explode(',', $request['position']); $filter0 = Cv::select('location') ->whereIn('position', $arrOfTags) ->groupBy('location') ->get(); $filter1 = Cv::select('about') ->whereIn('position', $arrOfTags) ->groupBy('about') ->get(); // 转换location项为统一结构 $locationItems = $filter0->map(function($item) { return [ 'field' => 'location', 'value' => $item->location ]; }); // 转换about项为统一结构 $aboutItems = $filter1->map(function($item) { return [ 'field' => 'about', 'value' => $item->about ]; }); // 合并两个集合 $filters = $locationItems->merge($aboutItems);
Blade模板
此时需要根据field字段判断渲染哪个复选框:
@foreach($filters as $filter) <li> <input type="checkbox" name="{{ $filter['field'] }}" value="{{ $filter['value'] }}"/> <span> {{ $filter['value'] }} </span> </li> @endforeach
为什么不推荐第二种?因为它会把两种不同的筛选项混在一起,如果你需要分开渲染(比如放在不同的筛选模块里),第一种方案的灵活性更高。
内容的提问来源于stack exchange,提问作者priMo-ex3m
相关产品推荐
相关产品推荐

