Laravel MongoDB迁移报错:Trying to get property 'size' of non-object 求助
解决MongoDB查询后视图中
Trying to get property 'size' of non-object错误 这个问题是从MySQL转MongoDB时非常典型的适配坑——核心原因是两种数据库查询返回的结果类型不一样:MySQL常用的Eloquent模型支持用->访问属性,但直接通过DB::collection()查询MongoDB返回的是包裹着数组型文档的集合对象,并非Eloquent模型实例,所以无法用对象属性的方式访问字段。
下面给你几个实用的解决方案:
方案1:直接修改视图的字段访问方式
最快的解决办法是把视图里的对象属性访问改成数组索引或者集合的get()方法:
- 数组索引访问:
@foreach ($records as $rec) {{ $rec['size'] }} @endforeach
- 集合
get()方法(更推荐,支持字段不存在时的默认值):
@foreach ($records as $rec) {{ $rec->get('size', '无数据') }} <!-- 第二个参数可设置字段不存在时的默认显示内容 --> @endforeach
方案2:先排查数据结构(确保字段存在)
你可以先在控制器里临时打印查询结果,确认size字段是否真的存在,以及每条记录的结构:
public function index() { $userid = Auth::user()->id; $users = DB::collection('Booking')->where('Uid', '>=', $userid)->get(); dd($users); // 临时添加,查看完数据结构后记得删除 return view('panel.main')->with('records',$users); }
另外要注意:MongoDB是大小写敏感的,如果你的集合里字段是Size而非size,也会导致找不到字段触发类似错误。
方案3:用MongoDB Eloquent模型回归对象式访问
如果你习惯用->访问字段的写法,可以创建对应的MongoDB Eloquent模型,让查询结果回到熟悉的对象形式:
- 确保你已经安装了Laravel的MongoDB扩展(比如
jenssegers/mongodb) - 创建
App\Models\Booking模型:
namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Booking extends Eloquent { protected $collection = 'Booking'; // 指定MongoDB中的集合名称 protected $connection = 'mongodb'; // 若配置了单独的MongoDB连接需指定 }
- 修改控制器中的查询代码:
use App\Models\Booking; class PanelController extends Controller { public function index() { $userid = Auth::user()->id; $users = Booking::where('Uid', '>=', $userid)->get(); return view('panel.main')->with('records',$users); } }
这样视图里的{{ $rec->size }}就能正常工作了,和你之前用MySQL Eloquent的方式完全一致。
内容的提问来源于stack exchange,提问作者user3694193
相关产品推荐
相关产品推荐

