Die Abfrageergebnisse von Eloquent werden IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
zurückgeben. Darüber hinaus gibt es in der Laravel-Dokumentation folgende Informationen:
Die meisten Eloquent-Sammlungen geben neue Instanzen der „Eloquent-Sammlung“ zurück, aber die Methoden „pluck“, „keys“, „zip“, „collapse“, „flatten“ und „flip“ geben Basissammlungsinstanzen zurück.
Entsprechend gilt: Wenn eine Kartenoperation eine Sammlung zurückgibt, die kein Eloquent-Modell enthält, wird diese automatisch in eine Basissammlung konvertiert.
Was ist also der Unterschied zwischen diesen beiden Kollektionen, oder „Basic Collection“ und „Eloquent Collection“?
看看源代码,我们可以看到
也就是说,
Illuminate\Database\Eloquent\Collection
是Illuminate\Support\Collection
的子类。你说的这几个方法,在
Illuminate\Database\Eloquent\Collection
中是这样定义的,以pluck
为例。而这里用到的
toBase
函数在Illuminate\Database\Eloquent\Collection
中没有定义,而是在Illuminate\Support\Collection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在Illuminate\Support\Collection
中是如何定义的。看吧,是返回了
new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是Illuminate\Support\Collection
了。Illuminate\Support\Collection
中的pluck
定义是这样的。而在
Illuminate\Support\Arr
中pluck
的定义是这样的。返回的是一个数组。
这样
Illuminate\Support\Collection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
的区别详见https://www.laravist.com/blog/post/php-new-static-and-new-self)。怎么样,现在明白了么?