Eloquent のクエリ結果は IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
を返します。さらに、Laravel のドキュメントには次の情報があります:
ほとんどの Eloquent コレクションは新しい「Eloquent コレクション」インスタンスを返しますが、pluck、keys、zip、collapse、 flatten、flip メソッドは基本コレクション インスタンスを返します。
同様に、マップ操作が Eloquent モデルを含まないコレクションを返す場合、それは自動的に基本コレクションに変換されます。
それでは、これら 2 つのコレクション、つまり「Basic Collection」と「Eloquent Collection」の違いは何でしょうか?
ソースコードを見ると、次のことが分かります
リーリーつまり、
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) でご覧いただけます。どうでしょう、分かりましたか?