Laravel 中两类 Collection 的区别?
PHP中文网
PHP中文网 2017-05-16 16:46:31
[PHP讨论组]

Eloquent 的查询结果会返回 Illuminate\Database\Eloquent\Collection,而使用 collect() 会返回 Illuminate\Support\Collection。而且,在 Laravel 文档中,有如下信息:

大部分的 Eloquent 集合会返回新的「Eloquent 集合」实例,但是 pluck, keys, zip, collapse, flatten 和 flip 方法会返回 基础集合 实例。

相应的,如果一个 map 操作返回一个不包含任何 Eloquent 模型的集合,那么它将会自动转换成基础集合。

那么,这两种 Collection,或者说是「基础集合」和「Eloquent 集合」有什么区别呢?

PHP中文网
PHP中文网

认证0级讲师

全部回复(1)
ringa_lee

看看源代码,我们可以看到

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

也就是说,Illuminate\Database\Eloquent\CollectionIlluminate\Support\Collection的子类。

你说的这几个方法,在Illuminate\Database\Eloquent\Collection中是这样定义的,以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函数在Illuminate\Database\Eloquent\Collection中没有定义,而是在Illuminate\Support\Collection中定义了。那么在子类中没有重写的方法,就会调用父类的方法。我们看看toBaseIlluminate\Support\Collection中是如何定义的。

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

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

而在Illuminate\Support\Arrpluck的定义是这样的。

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

返回的是一个数组。
这样Illuminate\Support\Collection中的new static(Arr::pluck),意思就是新建一个类的实例(new selfnew static的区别详见https://www.laravist.com/blog/post/php-new-static-and-new-self)。

怎么样,现在明白了么?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号