Eloquent의 쿼리 결과는 IlluminateDatabaseEloquentCollection
,而使用 collect()
会返回 IlluminateSupportCollection
를 반환합니다. 또한 Laravel 문서에는 다음 정보가 있습니다.
대부분의 Eloquent 컬렉션은 새로운 "Eloquent 컬렉션" 인스턴스를 반환하지만, pluck,keys,zip,collapse, flatten 및 Flip 메소드는 기본 컬렉션 인스턴스를 반환합니다.
따라서 맵 작업이 Eloquent 모델을 포함하지 않는 컬렉션을 반환하면 자동으로 기본 컬렉션으로 변환됩니다.
그렇다면, 이 두 컬렉션, 즉 "Basic Collection"과 "Eloquent Collection"의 차이점은 무엇인가요?
소스 코드를 보면 알 수 있습니다
으아악즉,
IlluminateDatabaseEloquentCollection
은IlluminateSupportCollection
의 하위 클래스입니다.IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。你说的这几个方法,在
IlluminateDatabaseEloquentCollection
中是这样定义的,以pluck
为例。而这里用到的
toBase
函数在IlluminateDatabaseEloquentCollection
中没有定义,而是在IlluminateSupportCollection
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。看吧,是返回了
new self($this)
,一个新的实例。由于这是在父类中的,自然返回的实例是IlluminateSupportCollection
了。IlluminateSupportCollection
中的pluck
定义是这样的。而在
IlluminateSupportArr
中pluck
的定义是这样的。返回的是一个数组。
당신이 언급한 메서드는这样
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에서 확인할 수 있습니다. 🎜 🎜어때요, 이제 이해가 되셨나요? 🎜