🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Collection操作 ### 介绍 模型返回的所有多结果集都是`Illuminate\Database\Eloquent\Collection`对象的实例,包括通过`get`方法检索或通过关系访问的结果。该`Collection`对象扩展了[基础集合](https://octobercms.com/docs/services/collections),因此它自然地继承了数十种用于流畅地使用基础模型数组的方法。 所有集合还充当迭代器,使您可以像遍历简单的PHP数组一样遍历它们: ~~~ $users = User::where('is_active', true)->get(); foreach ($users as $user) { echo $user->name; } ~~~ 但是,集合比数组强大得多,并且使用直观的界面公开了各种map / reduce操作。例如,让我们过滤所有活动模型并收集每个过滤用户的名称: ~~~ $users = User::get(); $names = $users->filter(function ($user) { return $user->is_active === true; }) ->map(function ($user) { return $user->name; }); ~~~ > **注:**虽然大多数模型收集方法返回的新实例`Eloquent`收藏,`pluck`,`keys`,`zip`,`collapse`,`flatten`和`flip`方法返回一个基本集合实例。同样,如果某个`map`操作返回的集合不包含任何模型,则它将自动转换为基本集合。 ### [](https://octobercms.com/docs/database/collection#usage-examples)可用方法 所有模型集合都扩展了基础集合对象。因此,它们继承了基本集合类提供的所有强大方法。 此外,`Illuminate\Database\Eloquent\Collection`该类还提供了方法的超集,以帮助管理模型集合。大多数方法返回`Illuminate\Database\Eloquent\Collection`实例;但是,某些方法返回一个基本`Illuminate\Support\Collection`实例。 **contains($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`是键数组,则find将返回与`$keys`using匹配的所有模型`whereIn()`: ~~~ $users = User::all(); $user = $users->find(1); ~~~ **fresh($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`急于加载集合中所有模型的给定关系的方法: ~~~ $users->load('comments', 'posts'); $users->load('comments.author'); ~~~ **loadMissing($relations)** `loadMissing`如果尚未加载关系,则该方法渴望为集合中的所有模型加载给定的关系: ~~~ $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]); ~~~ **unique($key = null,$strict = false)** 该`unique`方法返回集合中的所有唯一模型。与集合中另一个模型具有相同主键的相同类型的所有模型都将被删除。 ~~~ $users = $users->unique(); ~~~ ### [](https://octobercms.com/docs/database/collection#custom-collections)定制收藏 如果需要将自定义`Collection`对象与自己的扩展方法一起使用,则可以`newCollection`在模型上覆盖该方法: ~~~ class User extends Model { /** * Create a new Collection instance. */ public function newCollection(array $models = []) { return new CustomCollection($models); } } ~~~ 定义`newCollection`方法后,只要模型返回`Collection`实例,您将收到自定义集合的实例。如果要对插件或应用程序中的每个模型使用自定义集合,则应覆盖`newCollection`由所有模型扩展的模型基类上的方法。 ~~~ use October\Rain\Database\Collection as CollectionBase; class CustomCollection extends CollectionBase { } ~~~ ### [](https://octobercms.com/docs/database/collection#data-feed)数据馈送 数据提要允许您将多个模型类组合为一个集合。这对于创建提要和数据流同时支持分页使用很有用。它的工作`get`方式是在调用方法之前,以准备好的状态添加模型对象,然后将这些对象组合在一起以构成一个行为与常规数据集相同的集合。 本`DataFeed`类模仿一个普通类型,可以支持`limit`和`paginate`方法。 ### [](https://octobercms.com/docs/database/collection#creating-feed)创建一个新的提要 下一个示例将User,Post和Comment模型组合为一个集合,并返回前10条记录。 ~~~ $feed = new October\Rain\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(); ~~~ ### [](https://octobercms.com/docs/database/collection#data-feed-processing)处理结果 该`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; } ~~~ ### [](https://octobercms.com/docs/database/collection#data-feed-ordering)订购结果 可以通过单个数据库列对结果进行排序,该列可以是所有数据集使用的共享默认值,也可以使用`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(); ~~~