数据库:集合

Introduction

模型返回的所有多结果集都是Illuminate\Database\Eloquent\Collection 对象,包括通过get 方法或通过关系访问。这Collection 对象扩展了基础集合,因此它自然继承了数十种用于流畅地处理底层模型数组的方法。

所有集合也用作迭代器,允许您像简单的 PHP 数组一样循环遍历它们:

$users = User::where('is_active', true)->get();

foreach ($users as $user) {
    echo $user->name;
}

然而,集合比数组强大得多,并且使用直观的界面公开各种映射/归约操作。例如,让我们过滤所有活动模型并收集每个过滤用户的名称:

$users = User::get();

$names = $users->filter(function ($user) {
        return $user->is_active === true;
    })
    ->map(function ($user) {
        return $user->name;
    });

NOTE: 虽然大多数模型集合方法返回一个新的实例Eloquent 收藏, 的pluck,keys,zip,collapse,flattenflip 方法返回一个基础集合实例。同样,如果一个map 操作返回一个不包含任何模型的集合,它将自动转换为基础集合。

可用方法

所有模型集合都扩展了基础集合对象;因此,它们继承了集合基类提供的所有强大方法。

除此之外Illuminate\Database\Eloquent\Collection 类提供了一个超集的方法来帮助管理您的模型集合。大多数方法返回Illuminate\Database\Eloquent\Collection 实例;然而,一些方法返回一个基数Illuminate\Support\Collection 实例。

包含($key,$operator = null,$value = null)

contains 方法可用于确定给定模型实例是否包含在集合中。此方法接受主键或模型实例:

$users->contains(1);

$users->contains(User::find(1));

diff($items)

diff 方法返回给定集合中不存在的所有模型:

use App\User;

$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());

except($keys)

except 方法返回所有不具有给定主键的模型:

$users = $users->except([1, 2, 3]);

find($key)

find 方法查找具有给定主键的模型。如果$key 是一个模型实例,find 将尝试返回与主键匹配的模型。如果$key 是一个键数组,查找将返回匹配的所有模型$keys 使用whereIn():

$users = User::all();

$user = $users->find(1);

新鲜($with = [])

fresh 方法从数据库中检索集合中每个模型的新实例。此外,任何指定的关系都将被预先加载:

$users = $users->fresh();

$users = $users->fresh('comments');

intersect($items)

intersect 方法返回给定集合中也存在的所有模型:

use App\User;

$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());

load($relations)

load 方法 eager 加载集合中所有模型的给定关系:

$users->load('comments', 'posts');

$users->load('comments.author');

loadMissing($relations)

loadMissing 如果尚未加载关系,方法 eager 会加载集合中所有模型的给定关系:

$users->loadMissing('comments', 'posts');

$users->loadMissing('comments.author');

modelKeys()

modelKeys 方法返回集合中所有模型的主键:

$users->modelKeys();

// [1, 2, 3, 4, 5]

makeVisible($attributes)

makeVisible 方法使集合中每个模型上通常“隐藏”的属性可见:

$users = $users->makeVisible(['address', 'phone_number']);

makeHidden($attributes)

makeHidden 方法隐藏通常在集合中的每个模型上“可见”的属性:

$users = $users->makeHidden(['address', 'phone_number']);

only($keys)

only 方法返回所有具有给定主键的模型:

$users = $users->only([1, 2, 3]);

唯一($key = null,$strict = false)

unique 方法返回集合中的所有唯一模型。删除与集合中另一个模型具有相同主键的相同类型的任何模型。

$users = $users->unique();

自定义集合

如果您需要使用自定义Collection 使用您自己的扩展方法的对象,您可以重写newCollection 模型上的方法:

class User extends Model
{
    /**
     * Create a new Collection instance.
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

一旦你定义了一个newCollection 方法,只要模型返回一个,您就会收到一个自定义集合的实例Collection 实例。如果您想为插件或应用程序中的每个模型使用自定义集合,您应该重写newCollection 由所有模型扩展的模型基类上的方法。

use Winter\Storm\Database\Collection as CollectionBase;

class CustomCollection extends CollectionBase
{
}

数据馈送

数据馈送允许您将多个模型类组合到一个集合中。这对于创建提要和数据流非常有用,同时支持使用分页。它通过在准备状态之前添加模型对象来工作get 方法被调用,然后将它们组合起来形成一个行为与常规数据集相同的集合。

DataFeed 类模仿常规模型并支持limitpaginate 方法。

创建新提要

下一个示例将 User、Post 和 Comment 模型组合到一个集合中并返回前 10 条记录。

$feed = new Winter\Storm\Database\DataFeed;
$feed->add('user', new User);
$feed->add('post', Post::where('category_id', 7));

$feed->add('comment', function() {
    $comment = new Comment;
    return $comment->where('approved', true);
});

$results = $feed->limit(10)->get();

处理结果

get 方法将返回一个Collection 包含结果的对象。记录可以通过使用区分tag_name 添加模型时设置为第一个参数的属性。

foreach ($results as $result) {

    if ($result->tag_name == 'post')
        echo "New Blog Post: " . $record->title;

    elseif ($result->tag_name == 'comment')
        echo "New Comment: " . $record->content;

    elseif ($result->tag_name == 'user')
        echo "New User: " . $record->name;

}

订购结果

结果可以按单个数据库列排序,可以是所有数据集使用的共享默认值,也可以单独指定add 方法。结果的方向也必须共享。

// Ordered by updated_at if it exists, otherwise created_at
$feed->add('user', new User, 'ifnull(updated_at, created_at)');

// Ordered by id
$feed->add('comments', new Comment, 'id');

// Ordered by name (specified default below)
$feed->add('posts', new Post);

// Specifies the default column and the direction
$feed->orderBy('name', 'asc')->get();
豫ICP备18041297号-2