Laravel의 두 가지 컬렉션 유형의 차이점은 무엇입니까?
PHP中文网
PHP中文网 2017-05-16 16:46:31
0
1
604

Eloquent의 쿼리 결과는 IlluminateDatabaseEloquentCollection,而使用 collect() 会返回 IlluminateSupportCollection를 반환합니다. 또한 Laravel 문서에는 다음 정보가 있습니다.

대부분의 Eloquent 컬렉션은 새로운 "Eloquent 컬렉션" 인스턴스를 반환하지만, pluck,keys,zip,collapse, flatten 및 Flip 메소드는 기본 컬렉션 인스턴스를 반환합니다.

따라서 맵 작업이 Eloquent 모델을 포함하지 않는 컬렉션을 반환하면 자동으로 기본 컬렉션으로 변환됩니다.

그렇다면, 이 두 컬렉션, 즉 "Basic Collection"과 "Eloquent Collection"의 차이점은 무엇인가요?

PHP中文网
PHP中文网

认证0级讲师

모든 응답(1)
左手右手慢动作

소스 코드를 보면 알 수 있습니다

으아악

즉, IlluminateDatabaseEloquentCollectionIlluminateSupportCollection의 하위 클래스입니다. IlluminateDatabaseEloquentCollectionIlluminateSupportCollection的子类。

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

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

而在IlluminateSupportArrpluck的定义是这样的。

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

당신이 언급한 메서드는 IlluminateDatabaseEloquentCollection에 다음과 같이 정의되어 있습니다. pluck를 예로 들어 보겠습니다.

으아악

여기서 사용된 toBase 함수는 IlluminateDatabaseEloquentCollection에 정의되어 있지 않고 IlluminateSupportCollection에 정의되어 있습니다. 그런 다음 하위 클래스에 재정의된 메서드가 없으면 상위 클래스의 메서드가 호출됩니다. IlluminateSupportCollection에서 toBase가 어떻게 정의되어 있는지 살펴보겠습니다. 🎜 으아악 🎜보세요, new self($this)가 새로운 인스턴스로 반환되었습니다. 이는 상위 클래스에 있으므로 자연스럽게 반환되는 인스턴스는 IlluminateSupportCollection입니다. IlluminateSupportCollectionpluck 정의는 다음과 같습니다. 🎜 으아악 🎜IlluminateSupportArrpluck 정의는 다음과 같습니다. 🎜 으아악 🎜반환되는 것은 배열입니다.
이러한 방식으로 IlluminateSupportCollectionnew static(Arr::pluck)은 클래스의 새 인스턴스(new self)를 생성한다는 의미입니다. new static의 차이점은 https://www.laravist.com/blog/post/php-new-static-and-new-self에서 확인할 수 있습니다. 🎜 🎜어때요, 이제 이해가 되셨나요? 🎜
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿