Laravel 5.5返回多模型至视图时无法访问对象属性问题
问题原因与解决方法
你碰到这个Trying to get property of non-object报错的核心原因一目了然:你传给视图的$instrumentUnderEdit和$teamUnderEdit是JSON格式的字符串,而不是Eloquent模型对象或者数组!
为什么会这样?
你在getDetails()方法里调用了toJson(),把查询出来的模型直接转成了JSON字符串,然后把这两个字符串塞进数组返回。之后在details()方法里,只是把数组里的字符串原封不动取出来传给视图——在Blade模板里,你想用对象属性的方式->去访问一个字符串的“属性”,这显然行不通,字符串根本没有image这个属性,所以报错了。
解决方法(推荐第一种)
方法1:直接传递模型对象/数组(最佳实践)
修改你的getDetails()方法,不要提前转成JSON,直接返回模型实例或者模型转成的数组:
public function getDetails($id) { // ... 这里是你的查询逻辑,比如获取$instruments和$team // 直接返回模型对象 return [$instruments, $team]; // 如果你更习惯用数组,也可以转成数组后返回 // return [$instruments->toArray(), $team->toArray()]; }
这样在details()方法里拿到的就是模型对象(或者关联数组),传到视图后,不管是用$instrumentUnderEdit->image(对象方式)还是$instrumentUnderEdit['image'](数组方式),都能正常访问属性。
方法2:如果必须传JSON字符串,在视图中转成对象/数组
如果因为某些业务限制,你必须在getDetails()里返回JSON字符串,那就在Blade模板里把JSON转成可操作的对象或数组:
@php // 转成对象 $instrument = json_decode($instrumentUnderEdit); // 如果要转成关联数组,加第二个参数true // $instrument = json_decode($instrumentUnderEdit, true); @endphp <!-- 然后正常访问属性 --> {{ $instrument->image }} <!-- 如果是数组的话就用 {{ $instrument['image'] }} -->
小提醒
第一种方法是Laravel开发的常规操作,模型本身就支持直接传递给视图,Blade对模型对象的属性访问有很好的支持,完全没必要多做“转JSON再转回来”的无用功,既浪费性能又容易踩坑。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

