Quelle est la différence entre deux types de collections dans Laravel ?
PHP中文网
PHP中文网 2017-05-16 16:46:31
0
1
609

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 » ?

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(1)
左手右手慢动作

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. IlluminateDatabaseEloquentCollectionIlluminateSupportCollection的子类。

你说的这几个方法,在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中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBaseIlluminateSupportCollection中是如何定义的。

/**
 * 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));
}

而在IlluminateSupportArrpluck的定义是这样的。

/**
 * 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 selfnew static

Les méthodes que vous avez mentionnées sont définies comme ceci dans IlluminateDatabaseEloquentCollection, prenez pluck comme exemple.

rrreee

La fonction toBase 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.
De cette façon, 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 ? 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal