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

Laravel应用中获取关联模型属性时的两类错误求助

解决访问JSON字符串属性的错误问题

看起来你遇到的问题核心是:$wine->producer->location实际上是JSON格式的字符串,而不是PHP对象或数组,所以直接用对象属性访问(->address)或数组键访问(['address'])都会报错。

为什么会报错?

当你echo $wine->producer->location时看到的是JSON结构,但这只是字符串的输出效果。在PHP里它本质还是字符串,所以:

  • 用$wine->producer->location->address时,PHP会把字符串当成对象去取属性,自然报错“Trying to get property 'address' of non-object”
  • 用$wine->producer->location['address']时,PHP会把字符串当成数组去取偏移量,而'address'不是合法的数字偏移量,所以报错“Illegal string offset 'address'”

直接解决方案:解码JSON字符串

你需要先用json_decode()把这个JSON字符串转换成PHP对象或数组,再访问address属性:

方案1:转成PHP对象访问

foreach ($wines as $wine) {
    // 解码为对象
    $locationObj = json_decode($wine->producer->location);
    // 用null安全运算符避免空值/无效JSON导致的报错
    $address = $locationObj?->address; 
    echo $address;
}

方案2:转成PHP数组访问

foreach ($wines as $wine) {
    // 解码为数组(第二个参数传true)
    $locationArr = json_decode($wine->producer->location, true);
    // 用空合并运算符避免键不存在导致的报错
    $address = $locationArr['address'] ?? ''; 
    echo $address;
}

更优雅的Laravel方案:定义模型访问器

如果这是Laravel项目,推荐在Producer模型里定义一个访问器,自动把location字段解码成对象/数组,这样后续调用会更方便:

// app/Models/Producer.php
class Producer extends Model
{
    // ... 其他模型代码

    // 定义location字段的访问器
    public function getLocationAttribute($value)
    {
        // 转成对象,或者传true转成数组
        return json_decode($value);
    }
}

定义好之后,你就可以直接像最初想的那样访问了:

foreach ($wines as $wine) {
    $address = $wine->producer->location?->address;
    echo $address;
}

额外提示:处理JSON解码失败的情况

如果location字段可能是空值或无效JSON,建议加上判断避免报错:

$locationJson = $wine->producer->location;
$location = json_decode($locationJson);

if ($location !== null && isset($location->address)) {
    echo $location->address;
} else {
    echo '地址信息无效';
}

内容的提问来源于stack exchange,提问作者myoda999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:47:32