Les résultats de la requête d'Eloquent renverront IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
. De plus, dans la documentation de Laravel, on trouve les informations suivantes :
La plupart des collections Eloquent renvoient de nouvelles instances de « Collection Eloquent », mais les méthodes Pluck, Keys, Zip, Collapten, Flatten et Flip renvoient des instances de collection de base.
En conséquence, si une opération cartographique renvoie une collection qui ne contient aucun modèle Eloquent, elle sera automatiquement convertie en collection de base.
Alors, quelle est la différence entre ces deux Collections, ou « Collection Basique » et « Collection Eloquente » ?
En regardant le code source, nous pouvons voir
En d'autres termes,
IlluminateDatabaseEloquentCollection
est une sous-classe deIlluminateSupportCollection
.IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。你说的这几个方法,在
IlluminateDatabaseEloquentCollection
中是这样定义的,以pluck
为例。而这里用到的
toBase
函数在IlluminateDatabaseEloquentCollection
中没有定义,而是在IlluminateSupportCollection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。看吧,是返回了
new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是IlluminateSupportCollection
了。IlluminateSupportCollection
中的pluck
定义是这样的。而在
IlluminateSupportArr
中pluck
的定义是这样的。返回的是一个数组。
Les méthodes que vous avez mentionnées sont définies comme ceci dans这样
IlluminateSupportCollection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
IlluminateDatabaseEloquentCollection
, prenezpluck
comme exemple.rrreee
La fonctiontoBase
utilisée ici n'est pas définie dansIlluminateDatabaseEloquentCollection
, mais est définie dansIlluminateSupportCollection
. Ensuite, s'il n'y a pas de méthode surchargée dans la sous-classe, la méthode de la classe parent sera appelée. Jetons un coup d'œil à la façon donttoBase
est défini dansIlluminateSupportCollection
. 🎜 rrreee 🎜Regardez, il renvoienew self($this)
, une nouvelle instance. Puisqu'il s'agit de la classe parent, l'instance naturellement renvoyée estIlluminateSupportCollection
. La définition depluck
dansIlluminateSupportCollection
est la suivante. 🎜 rrreee 🎜La définition depluck
dansIlluminateSupportArr
est comme ceci. 🎜 rrreee 🎜Ce qui est renvoyé est un tableau.De cette façon,
new static(Arr::pluck)
dansIlluminateSupportCollection
signifie créer une nouvelle instance de la classe (new self
etnew static
peut être trouvée sur https://www.laravist.com/blog/post/php-new-static-and-new-self). 🎜 🎜Et si, tu comprends maintenant ? 🎜