Laravel 5.8升级至7.x后cityList函数返回结构异常修复咨询
Laravel 5.8升级至7版本后cityList()返回结构异常修复
我将Laravel应用从v5.8升级到v7版本后,整体运行正常,但自己编写的cityList()函数返回的数组结构发生了变化,导致原本的模板访问方式失效。
函数代码
public function cityList() { $cities = []; foreach($this->messages()->with('city')->select('messages.*', DB::raw('COUNT(*) as counter')) ->where('created_at', '>=', Carbon::now()->subHours(24)->toDateTimeString()) ->groupBy('city_id') ->get() as $_message) { $city = $_message->city; if($city) { if($_message->counter >= config('options.city_list_count')) { $url = null; if(Route::has('provider.city')) { $url = route('provider.city', [ $this->name_slug, $city->name_slug ]); } $cities[$city->name_slug] = (object) [ $city->name, $_message->counter, $url ]; } } } return $cities; }
旧版本模板访问方式
@foreach($provider->cityList() as $_city) <strong style="color:#E11F00;">{{ $_city->name }}{{ ($loop->last == false) ? ',' : '' }}</strong> @endforeach
当前输出结构
array:1 [▼ "vienna" => {#462 ▼ +"0": "Vienna" +"1": 6 +"2": null } ]
期望的输出结构
array:1 [▼ "vienna" => {#462 ▼ +"name": "Vienna" +"count": 6 +"url": null } ]
修复方法
问题根源在于你将索引数组直接转为对象,Laravel版本升级后,这种转换的处理逻辑发生了变化,导致对象属性变成了数字索引而非预期的命名键。
只需修改数组定义部分,将索引数组改为关联数组,指定对应的键名即可:
// 替换原来的对象赋值代码 $cities[$city->name_slug] = (object) [ 'name' => $city->name, 'count' => $_message->counter, 'url' => $url ];
修改后,返回的对象就会带有name、count、url三个命名属性,模板中$_city->name的访问方式就能正常工作了。
内容的提问来源于stack exchange,提问作者Raphael W
相关产品推荐
相关产品推荐

