# 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();
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图