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
相关产品推荐
相关产品推荐

