搜尋

首頁  >  問答  >  主體

Laravel 中兩類 Collection 的差異?

Eloquent 的查詢結果會回傳 Illuminate\Database\Eloquent\Collection,而使用 collect() 會回傳 Illuminate\Support\Collection。而且,在 Laravel 文件中,有以下資訊:

大部分的 Eloquent 集合會傳回新的「Eloquent 集合」實例,但是 pluck, keys, zip, collapse, flatten 和 flip 方法會傳回 基礎集合 實例。

對應的,如果一個 map 運算傳回一個不包含任何 Eloquent 模型的集合,那麼它將會自動轉換成基礎集合。

那麼,這兩種 Collection,或者說是「基礎集合」和「Eloquent 集合」有什麼差別呢?

PHP中文网PHP中文网2795 天前654

全部回覆(1)我來回復

  • ringa_lee

    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

    也就是說,IlluminateDatabaseEloquentCollectionIlluminateSupportCollection的子類別。

    你說的這幾個方法,在IlluminateDatabaseEloquentCollection中是这样定义的,以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函数在IlluminateDatabaseEloquentCollection中没有定义,而是在IlluminateSupportCollection中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBaseIlluminateSupportCollection中是如何定義的。

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

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

    而在IlluminateSupportArrpluck的定義是這樣的。

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

    回傳的是一個陣列。
    這樣IlluminateSupportCollection中的new static(Arr::pluck),意思就是新建一个类的实例(new selfnew static的差異詳見https://www.laravist.com/blog/post/php-new-static-and-new-self)。

    怎麼樣,現在明白了?

    回覆
    0
  • 取消回覆