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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:52:30