Maison > Questions et réponses > le corps du texte
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 » ?
ringa_lee2017-05-16 16:48:31
En regardant le code source, nous pouvons voir
<?php
namespace Illuminate\Database\Eloquent;
use LogicException;
use Illuminate\Support\Arr;
use Illuminate\Contracts\Queue\QueueableCollection;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection implements QueueableCollection
En d'autres termes, IlluminateDatabaseEloquentCollection
est une sous-classe de IlluminateSupportCollection
. IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。
你说的这几个方法,在IlluminateDatabaseEloquentCollection
中是这样定义的,以pluck
为例。
/**
* Get an array with the values of a given key.
*
* @param string $value
* @param string|null $key
* @return \Illuminate\Support\Collection
*/
public function pluck($value, $key = null)
{
return $this->toBase()->pluck($value, $key);
}
而这里用到的toBase
函数在IlluminateDatabaseEloquentCollection
中没有定义,而是在IlluminateSupportCollection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。
/**
* Get a base Support collection instance from this collection.
*
* @return \Illuminate\Support\Collection
*/
public function toBase()
{
return new self($this);
}
看吧,是返回了new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是IlluminateSupportCollection
了。IlluminateSupportCollection
中的pluck
定义是这样的。
/**
* Get the values of a given key.
*
* @param string|array $value
* @param string|null $key
* @return static
*/
public function pluck($value, $key = null)
{
return new static(Arr::pluck($this->items, $value, $key));
}
而在IlluminateSupportArr
中pluck
的定义是这样的。
/**
* Pluck an array of values from an array.
*
* @param array $array
* @param string|array $value
* @param string|array|null $key
* @return array
*/
public static function pluck($array, $value, $key = null);
返回的是一个数组。
这样IlluminateSupportCollection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
IlluminateDatabaseEloquentCollection
, prenez pluck
comme exemple. rrreee
La fonctiontoBase
utilisée ici n'est pas définie dans IlluminateDatabaseEloquentCollection
, mais est définie dans IlluminateSupportCollection
. 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 dont toBase
est défini dans IlluminateSupportCollection
. 🎜
rrreee
🎜Regardez, il renvoie new self($this)
, une nouvelle instance. Puisqu'il s'agit de la classe parent, l'instance naturellement renvoyée est IlluminateSupportCollection
. La définition de pluck
dans IlluminateSupportCollection
est la suivante. 🎜
rrreee
🎜La définition de pluck
dans IlluminateSupportArr
est comme ceci. 🎜
rrreee
🎜Ce qui est renvoyé est un tableau. new static(Arr::pluck)
dans IlluminateSupportCollection
signifie créer une nouvelle instance de la classe (new self
et new static
peut être trouvée sur https://www.laravist.com/blog/post/php-new-static-and-new-self). 🎜
🎜Et si, tu comprends maintenant ? 🎜