前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文:Laravel模型集合跟基类真不一样,别混为一谈

3分钟短文:Laravel模型集合跟基类真不一样,别混为一谈

作者头像
程序员小助手
发布2020-09-21 15:27:05
1K0
发布2020-09-21 15:27:05
举报
文章被收录于专栏:程序员小助手

引言

laravel在功能拆分上相当灵活,其中查询返回的数据集,虽然继承了基类集合, 但是有一些特定的方法和用法。很多小白在写的时候,往往分不清到底是用的哪个类的哪个方法,导致凭空报错。本文就来为大家梳理梳理。

代码时间

laravel系统的基类就是 Illuminate\Support\Collection,同时提供了一个快捷助手函数collect 用于实例化一个集合类。该助手函数的代码很简单,就是new一个对象:

代码语言:javascript
复制
new Collection($value);

比如有一个数组,将其实例化为一个集合类:

代码语言:javascript
复制
$collection = collect([1, 2, 3]);

集合类可以调用系统提供的方法,非常灵活地操作数据。比如将上述数组内所有的偶数剔除掉:

代码语言:javascript
复制
$odds = $collection->reject(function ($item) {
    return $item % 2 === 0;});

reject方法接收一个匿名函数,满足条件的将被从集合中剔除。

或者把集合内所有的数据乘以10返回,我们调用map方法进行遍历:

代码语言:javascript
复制
$multiplied = $collection->map(function ($item) {
    return $item * 10;
});

上面说的方法都是链式可操作的,可以把操作一气呵成,比如返回数组中所有的偶数,并将所有元素乘以10,最后求和。直接贴代码:

代码语言:javascript
复制
$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返回的数据集合。

代码语言:javascript
复制
use Illuminate\Database\Eloquent\Collection;class OrderCollection extends Collection{
    public function sumBillableAmount()
    {
        return $this->reduce(function ($carry, $order) {
            return $carry + ($order->billable ? $order->amount : 0);
        }, 0);
    }}

然后在模型内进行注册:

代码语言:javascript
复制
class Order extends Model{
    public function newCollection(array $models = [])
    {
        return new OrderCollection($models);
    }}

那么在代码中就可以这样用:

代码语言:javascript
复制
$orders = Order::all();$billableAmount = $orders->sumBillableAmount();

注意使用all方法返回的是一个eloquent collection集合。这样把一些运算操作放在程序内,而非数据库SQL 语句内进行,可进一步提高效率。

对于集合的序列化操作,其实有很标准的写法,比如 toArray toJson这些方法, 可以在返回的数据集对象上直接调用:

代码语言:javascript
复制
$contactArray = Contact::first()->toArray();$contactJson = Contact::first()->toJson();$contactsArray = Contact::all()->toArray();$contactsJson = Contact::all()->toJson();

序列化,或者说格式化牵涉的内容比较多,实际使用也很复杂。此处我们不展开说明了。

写在最后

本文展示了eloquent collection对象的相关操作和方法,大家注意区别于常规的集合类。

Happy coding :-)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 代码时间
  • 写在最后
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档