Eloquent의 쿼리 결과는 IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
를 반환합니다. 또한 Laravel 문서에는 다음 정보가 있습니다.
대부분의 Eloquent 컬렉션은 새로운 "Eloquent 컬렉션" 인스턴스를 반환하지만, pluck,keys,zip,collapse, flatten 및 Flip 메소드는 기본 컬렉션 인스턴스를 반환합니다.
따라서 맵 작업이 Eloquent 모델을 포함하지 않는 컬렉션을 반환하면 자동으로 기본 컬렉션으로 변환됩니다.
그렇다면, 이 두 컬렉션, 즉 "Basic Collection"과 "Eloquent Collection"의 차이점은 무엇인가요?
ringa_lee2017-05-16 16:48:31
소스 코드를 보면 알 수 있습니다
으아악즉, IlluminateDatabaseEloquentCollection
은 IlluminateSupportCollection
의 하위 클래스입니다. IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。
你说的这几个方法,在IlluminateDatabaseEloquentCollection
中是这样定义的,以pluck
为例。
<?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
而这里用到的toBase
函数在IlluminateDatabaseEloquentCollection
中没有定义,而是在IlluminateSupportCollection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。
/**
* 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);
}
看吧,是返回了new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是IlluminateSupportCollection
了。IlluminateSupportCollection
中的pluck
定义是这样的。
/**
* Get a base Support collection instance from this collection.
*
* @return \Illuminate\Support\Collection
*/
public function toBase()
{
return new self($this);
}
而在IlluminateSupportArr
中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));
}
返回的是一个数组。
这样IlluminateSupportCollection
中的new static(Arr::pluck)
,意思就是新建一个类的实例(new self
和new static
IlluminateDatabaseEloquentCollection
에 다음과 같이 정의되어 있습니다. pluck
를 예로 들어 보겠습니다. 으아악
여기서 사용된toBase
함수는 IlluminateDatabaseEloquentCollection
에 정의되어 있지 않고 IlluminateSupportCollection
에 정의되어 있습니다. 그런 다음 하위 클래스에 재정의된 메서드가 없으면 상위 클래스의 메서드가 호출됩니다. IlluminateSupportCollection
에서 toBase
가 어떻게 정의되어 있는지 살펴보겠습니다. 🎜
으아악
🎜보세요, new self($this)
가 새로운 인스턴스로 반환되었습니다. 이는 상위 클래스에 있으므로 자연스럽게 반환되는 인스턴스는 IlluminateSupportCollection
입니다. IlluminateSupportCollection
의 pluck
정의는 다음과 같습니다. 🎜
으아악
🎜IlluminateSupportArr
의 pluck
정의는 다음과 같습니다. 🎜
으아악
🎜반환되는 것은 배열입니다. IlluminateSupportCollection
의 new static(Arr::pluck)
은 클래스의 새 인스턴스(new self
)를 생성한다는 의미입니다. new static
의 차이점은 https://www.laravist.com/blog/post/php-new-static-and-new-self에서 확인할 수 있습니다. 🎜
🎜어때요, 이제 이해가 되셨나요? 🎜