Rumah > Soal Jawab > teks badan
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"?
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
. IlluminateDatabaseEloquentCollection
是IlluminateSupportCollection
的子类。
你说的这几个方法,在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
中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBase
在IlluminateSupportCollection
中是如何定义的。
/**
* 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));
}
而在IlluminateSupportArr
中pluck
的定义是这样的。
/**
* 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 self
和new static
IlluminateDatabaseEloquentCollection
, ambil pluck
sebagai contoh. rrreee
FungsitoBase
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. 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? 🎜