cari

Rumah  >  Soal Jawab  >  teks badan

Apakah perbezaan antara dua jenis Koleksi dalam Laravel?

Hasil pertanyaan Eloquent akan kembali IlluminateDatabaseEloquentCollection,而使用 collect() 会返回 IlluminateSupportCollection. Selain itu, dalam dokumentasi Laravel, terdapat maklumat berikut:

Kebanyakan koleksi Eloquent mengembalikan contoh "Koleksi Eloquent" baharu, tetapi kaedah pluck, kunci, zip, runtuh, rata dan flip mengembalikan contoh koleksi asas.

Sehubungan itu, jika operasi peta mengembalikan koleksi yang tidak mengandungi sebarang model Eloquent, ia akan ditukar secara automatik kepada koleksi asas.

Jadi, apakah perbezaan antara kedua-dua Koleksi ini, atau "Koleksi Asas" dan "Koleksi Eloquent"?

PHP中文网PHP中文网2810 hari yang lalu658

membalas semua(1)saya akan balas

  • ringa_lee

    ringa_lee2017-05-16 16:48:31

    Melihat kod sumber, kita boleh melihat

    <?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

    Dalam erti kata lain, IlluminateDatabaseEloquentCollection ialah subkelas IlluminateSupportCollection. 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

    Kaedah yang anda nyatakan ditakrifkan seperti ini dalam IlluminateDatabaseEloquentCollection, ambil pluck sebagai contoh.

    rrreee

    Fungsi toBase yang digunakan di sini tidak ditakrifkan dalam IlluminateDatabaseEloquentCollection, tetapi ditakrifkan dalam IlluminateSupportCollection. Kemudian jika tiada kaedah yang ditindih dalam subkelas, kaedah kelas induk akan dipanggil. Mari kita lihat bagaimana toBase ditakrifkan dalam IlluminateSupportCollection. 🎜 rrreee 🎜Lihat, new self($this) dikembalikan, contoh baharu. Memandangkan ini berada dalam kelas induk, contoh yang dikembalikan secara semula jadi ialah IlluminateSupportCollection. Takrifan pluck dalam IlluminateSupportCollection adalah seperti ini. 🎜 rrreee 🎜Takrifan pluck dalam IlluminateSupportArr adalah seperti ini. 🎜 rrreee 🎜Apa yang dikembalikan ialah array.
    Dengan cara ini, statik baharu(Arr::pluck) dalam IlluminateSupportCollection bermaksud mencipta contoh baharu kelas (diri baharu dan statik baharu boleh didapati di https://www.laravist.com/blog/post/php-new-static-and-new-self). 🎜 🎜Bagaimana pula, adakah anda faham sekarang? 🎜

    balas
    0
  • Batalbalas