Was ist der Unterschied zwischen zwei Arten von Sammlungen in Laravel?
PHP中文网
PHP中文网 2017-05-16 16:46:31
0
1
597

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

PHP中文网
PHP中文网

认证0级讲师

Antworte allen(1)
左手右手慢动作

看看源代码,我们可以看到

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

也就是说,Illuminate\Database\Eloquent\CollectionIlluminate\Support\Collection的子类。

你说的这几个方法,在Illuminate\Database\Eloquent\Collection中是这样定义的,以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函数在Illuminate\Database\Eloquent\Collection中没有定义,而是在Illuminate\Support\Collection中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBaseIlluminate\Support\Collection中是如何定义的。

/**
 * Get a base Support collection instance from this collection.
 *
 * @return \Illuminate\Support\Collection
 */
public function toBase()
{
    return new self($this);
}

看吧,是返回了new self($this),一个新的实例。由于这是在父类中的,自然返回的实例是Illuminate\Support\Collection了。Illuminate\Support\Collection中的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));
}

而在Illuminate\Support\Arrpluck的定义是这样的。

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

返回的是一个数组。
这样Illuminate\Support\Collection中的new static(Arr::pluck),意思就是新建一个类的实例(new selfnew static的区别详见https://www.laravist.com/blog/post/php-new-static-and-new-self)。

怎么样,现在明白了么?

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage