Heim > Fragen und Antworten > Hauptteil
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“?
ringa_lee2017-05-16 16:48:31
看看源代码,我们可以看到
<?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\Collection
是Illuminate\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
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在Illuminate\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\Arr
中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);
返回的是一个数组。
这样Illuminate\Support\Collection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
的区别详见https://www.laravist.com/blog/post/php-new-static-and-new-self)。
怎么样,现在明白了么?