Laravel Blade中如何在foreach中使用两个变量?解决array_merge报错
问题描述
有两个变量,一个用于搜索功能,另一个用于从数据库根据ID显示名称。控制器代码如下:
public function recorddisplay(Request $request) { $search =$request['search'] ??""; if($search != "") { $covidrecord=Covidrecord::where('fullname','LIKE',"%$search%") ->orWhere('province','LIKE',"%$search%") ->orWhere('district','LIKE',"%$search%") ->orWhere('localgovernment','LIKE',"%$search%")->paginate(15); } else{ $covidrecord= Covidrecord::paginate(15); } $data = compact('covidrecord','search'); $dataCovid=DB::table('coviddeathrecord') ->join('district','coviddeathrecord.district','=','district.id') ->join('province','coviddeathrecord.province','=','province.id') ->join('localgovernment','coviddeathrecord.localgovernment','=','localgovernment.id') ->get(['coviddeathrecord.*','district.district','province.province','localgovernment.localgovernment']); return view('admin.dashboard.display', compact('dataCovid'))->with($data); }
Blade视图代码如下:
@foreach(array_merge($covidrecord,$dataCovid) as $data) <tr> <td> <div class="d-flex px-2 py-1"> <div class="d-flex flex-column justify-content-center"> {{-- <label>{{ $data->fullname }}</label> --}} <h6 class="mb-0 text-sm">{{$data->fullname}}</h6> <p class="text-xs text-secondary mb-0">{{$data->gender }} ,{{$data->age }} वर्ष</p> </div> </div> </td> <td> <p class="text-xs font-weight-bold mb-0">{{ $address->province }}</p> <p class="text-xs text-secondary mb-0">{{ $address->district }}, {{$address->localgovernment }}<br/> {{ $data->tole }}</p> </td> @endforeach
尝试使用array_merge合并两个变量时抛出错误:array_merge(): Expected parameter 1 to be an array, object given,请问如何正确在Laravel Blade的foreach中使用这两个变量?
错误原因
$covidrecord是LengthAwarePaginator对象(因为调用了paginate()方法),$dataCovid是Laravel的Collection集合对象,而array_merge()只能处理纯数组,无法直接合并Laravel的对象类型,因此触发报错。
解决方案
方案1:合并所有数据(不保留分页)
如果不需要保留搜索结果的分页功能,可以先把分页对象转成集合,再用集合的merge()方法合并两个数据集:
控制器修改
public function recorddisplay(Request $request) { $search =$request['search'] ??""; if($search != "") { $covidrecord=Covidrecord::where('fullname','LIKE',"%$search%") ->orWhere('province','LIKE',"%$search%") ->orWhere('district','LIKE',"%$search%") ->orWhere('localgovernment','LIKE',"%$search%")->paginate(15); } else{ $covidrecord= Covidrecord::paginate(15); } // 将分页结果转为集合 $covidCollection = $covidrecord->getCollection(); // 合并两个集合 $combinedData = $covidCollection->merge($dataCovid); return view('admin.dashboard.display', compact('combinedData', 'search')); }
Blade视图修改
@foreach($combinedData as $data) <tr> <td> <div class="d-flex px-2 py-1"> <div class="d-flex flex-column justify-content-center"> <h6 class="mb-0 text-sm">{{$data->fullname}}</h6> <p class="text-xs text-secondary mb-0">{{$data->gender }} ,{{$data->age }} वर्ष</p> </div> </div> </td> <td> <!-- 注意:原代码的$address未定义,直接使用$data关联出的字段 --> <p class="text-xs font-weight-bold mb-0">{{ $data->province }}</p> <p class="text-xs text-secondary mb-0">{{ $data->district }}, {{$data->localgovernment }}<br/> {{ $data->tole }}</p> </td> @endforeach
方案2:保留分页功能,分开遍历
如果需要保留搜索结果的分页,同时显示$dataCovid的数据,可以分开遍历两个数据集:
<!-- 遍历分页的搜索结果 --> @foreach($covidrecord as $data) <tr> <td> <div class="d-flex px-2 py-1"> <div class="d-flex flex-column justify-content-center"> <h6 class="mb-0 text-sm">{{$data->fullname}}</h6> <p class="text-xs text-secondary mb-0">{{$data->gender }} ,{{$data->age }} वर्ष</p> </div> </div> </td> <td> <p class="text-xs font-weight-bold mb-0">{{ $data->province }}</p> <p class="text-xs text-secondary mb-0">{{ $data->district }}, {{$data->localgovernment }}<br/> {{ $data->tole }}</p> </td> @endforeach <!-- 遍历$dataCovid的数据 --> @foreach($dataCovid as $data) <tr> <td> <div class="d-flex px-2 py-1"> <div class="d-flex flex-column justify-content-center"> <h6 class="mb-0 text-sm">{{$data->fullname}}</h6> <p class="text-xs text-secondary mb-0">{{$data->gender }} ,{{$data->age }} वर्ष</p> </div> </div> </td> <td> <p class="text-xs font-weight-bold mb-0">{{ $data->province }}</p> <p class="text-xs text-secondary mb-0">{{ $data->district }}, {{$data->localgovernment }}<br/> {{ $data->tole }}</p> </td> @endforeach <!-- 显示分页链接 --> {{ $covidrecord->links() }}
额外提示
- Laravel集合自带
merge()方法,专门用于合并集合,比array_merge()更适配框架内的数据类型。 - 如果两个数据集的字段结构不一致,遍历前可以用
isset($data->字段名)做判断,避免属性不存在的报错。
内容的提问来源于stack exchange,提问作者sami
相关产品推荐
相关产品推荐

