MongoDB PHP驱动Cursor遍历疑问:$r是数组还是Score模型实例?
关于MongoDB PHP驱动Cursor遍历及模型实例/数组的疑问解答
嘿,我来拆解你这几个问题:
1. 遍历过程中$r是数组还是Score模型实例?
你这里用的是Score::collection()获取的集合实例,这是Laravel MongoDB Eloquent的用法。当你调用find()返回Cursor后,遍历的时候$r会是Score模型的实例,而不是单纯的数组。因为Eloquent会自动把MongoDB返回的文档“hydrate”(填充)成对应的模型对象,保留模型的所有属性和方法。
2. foreach遍历Cursor时是否会自动将记录转换为数组?
不会自动转成数组。默认情况下,遍历Cursor得到的是模型实例。如果想要获取数组,你有几种方式:
- 在遍历的时候手动调用模型的
toArray()方法:$rArray = $r->toArray(); - 或者在查询链上使用
cursor()->map()来批量转换:$scoreRecords = $scoresCollection->find(['score.pairID'=>['$exists'=>false]]) ->sort(['created'=>1]) ->limit(4) ->cursor() ->map(fn($model) => $model->toArray());
3. 以数组形式获取数据是否性能更优?
是的,数组形式确实性能更好。原因在于模型实例的创建需要额外的开销:
- 要处理属性的填充、类型转换
- 要维护模型的状态、事件监听
- 如果模型有关联,还会预加载关联的相关逻辑(即使你没用到)
这些操作都会消耗更多的内存和CPU时间。如果你的业务场景只需要读取数据,不需要使用模型的任何方法、事件或者关联功能,直接用数组的话能显著降低资源消耗,尤其是在处理大量数据的时候,这种性能差异会更明显。
内容的提问来源于stack exchange,提问作者JohnPan
相关产品推荐
相关产品推荐

