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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:05