Eloquent 的查询结果会返回 IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
。而且,在 Laravel 文档中,有如下信息:
大部分的 Eloquent 集合会返回新的「Eloquent 集合」实例,但是 pluck, keys, zip, collapse, flatten 和 flip 方法会返回 基础集合 实例。
相应的,如果一个 map 操作返回一个不包含任何 Eloquent 模型的集合,那么它将会自动转换成基础集合。
那么,这两种 Collection,或者说是「基础集合」和「Eloquent 集合」有什么区别呢?
看看源代码,我们可以看到
也就是说,
IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。你说的这几个方法,在
IlluminateDatabaseEloquentCollection
中是这样定义的,以pluck
为例。而这里用到的
toBase
函数在IlluminateDatabaseEloquentCollection
中没有定义,而是在IlluminateSupportCollection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。看吧,是返回了
new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是IlluminateSupportCollection
了。IlluminateSupportCollection
中的pluck
定义是这样的。而在
IlluminateSupportArr
中pluck
的定义是这样的。返回的是一个数组。
这样
IlluminateSupportCollection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
的区别详见https://www.laravist.com/blog/post/php-new-static-and-new-self)。怎么样,现在明白了么?