3分钟短文:Laravel模型集合跟基类真不一样,别混为一谈
引言
laravel在功能拆分上相当灵活,其中查询返回的数据集,虽然继承了基类集合, 但是有一些特定的方法和用法。很多小白在写的时候,往往分不清到底是用的哪个类的哪个方法,导致凭空报错。本文就来为大家梳理梳理。
代码时间
laravel系统的基类就是 IlluminateSupportCollection,同时提供了一个快捷助手函数collect 用于实例化一个集合类。该助手函数的代码很简单,就是new一个对象:
new Collection($value);
比如有一个数组,将其实例化为一个集合类:
$collection = collect([1, 2, 3]);
集合类可以调用系统提供的方法,非常灵活地操作数据。比如将上述数组内所有的偶数剔除掉:
$odds = $collection->reject(function ($item) {
return $item % 2 === 0;});
reject方法接收一个匿名函数,满足条件的将被从集合中剔除。
或者把集合内所有的数据乘以10返回,我们调用map方法进行遍历:
$multiplied = $collection->map(function ($item) {
return $item * 10;
});
上面说的方法都是链式可操作的,可以把操作一气呵成,比如返回数组中所有的偶数,并将所有元素乘以10,最后求和。直接贴代码:
$sum = $collection->filter(function ($item) {
return $item % 2 == 0;})->map(function ($item) {
return $item * 10;})->sum();
是不是比写foreach循环操作数组流畅直观的多了?
虽然eloquent collection继承了基类Collection的特性,但是对于模型类的特性 有许多独特的方法。比如 modelKeys() 返回所有集合模型的primary key。比如调用 find($id) 的方法返回的是根据模型实例的primary id查找到的模型对象。
这与原始的集合的方法都有着本质的不同。系统自带的方法在复杂应用下不能满足多元化的需求, 我们这时就需要手动自建集合类,用于特定的操作。
比如在订单模型内,把所有已经支付的订单进行求和返回。我们手动创建一个eloquent collection 用于操作query builder返回的数据集合。
use IlluminateDatabaseEloquentCollection;class OrderCollection extends Collection{
public function sumBillableAmount()
{
return $this->reduce(function ($carry, $order) {
return $carry + ($order->billable ? $order->amount : 0);
}, 0);
}}
然后在模型内进行注册:
class Order extends Model{
public function newCollection(array $models = [])
{
return new OrderCollection($models);
}}
那么在代码中就可以这样用:
$orders = Order::all();$billableAmount = $orders->sumBillableAmount();
注意使用all方法返回的是一个eloquent collection集合。这样把一些运算操作放在程序内,而非数据库SQL 语句内进行,可进一步提高效率。
对于集合的序列化操作,其实有很标准的写法,比如 toArray toJson这些方法, 可以在返回的数据集对象上直接调用:
$contactArray = Contact::first()->toArray();$contactJson = Contact::first()->toJson();$contactsArray = Contact::all()->toArray();$contactsJson = Contact::all()->toJson();
序列化,或者说格式化牵涉的内容比较多,实际使用也很复杂。此处我们不展开说明了。
写在最后
本文展示了eloquent collection对象的相关操作和方法,大家注意区别于常规的集合类。
Happy coding :-)
- 暴涨210倍的一个数字货币正悄无声息崛起
- QT Creator 快速入门教程 读书笔记(一)
- .NET程序优化(GCServer )
- redis 学习笔记(4)-HA高可用方案Sentinel配置
- oracle: job使用
- velocity模板引擎学习(2)-velocity tools 2.0
- java:如何用代码控制H2 Database启动
- 游戏开发完整学习路线(各个版本都有)
- spring mvc4:异常处理
- TCP/IP, WebSocket 和 MQTT
- struts2: 玩转 rest-plugin
- 设置系统环境变量立即生效的VBS脚本
- velocity模板引擎学习(1)
- mybatis 3.x 缓存Cache的使用
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- BFE.dev前端刷题11 - 什么是composition?实现一个pipe()方法
- SSH整合主要XML代码
- struts标签中的select
- 通过反射技术获取泛型真实实例
- 使用POI操作Excel
- StrutsResultSupport的使用
- QueryHelper插件类(hql)
- Action中使用Json
- Spring 集成Quartz
- springMVC笔记一
- springMVC笔记二
- 译|通过构建自己的JavaScript测试框架来了解JS测试
- 百兆、千兆、POE网络中网线线序
- WPF 解决 Skia 因为找不到字体而绘制不出中文字符
- 视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——通过流媒体服务开启语音对讲