PHP Laravel框架支持Model查询数据后可以有多种方式返回数据,对新手会造成一些困扰,比如数组Model对象、集合、纯数组

今天从内存占用的角度对比一下3种数据返回方式

按数组Model对象返回数据

  • 写法
TestModel::query()->where('field_name', $value)->limit(10)->get()->all();

按集合返回数据

  • 写法
TestModel::query()->where('field_name', $value)->limit(10)->get();

按纯数组返回数据

  • 写法
TestModel::query()->where('field_name', $value)->limit(10)->get()->toArray();

测试环境

PHP 7.2.28, Docker Compose, MacOS

对比数据

  • 按数量分别取10、100、1000、10000行数据来对比
返回格式 查询行数 查询结果内存占用
Model数组 10 433.2109K
array 10 457.5313K
Collection 10 433.2891K
Model数组 100 803.3984K
array 100 816.4688K
Collection 100 803.4766K
Model数组 1000 4.3761M
array 1000 4.2790M
Collection 1000 4.3762M
Model数组 10000 40.4700M
array 10000 39.2743M
Collection 10000 40.4701M

结论

  1. 数据量在100以内时,用Model数组占用内存还更少
  2. Collection总比Model数组多一点点是因为Collection集合多了一层对象包装存储Model数组,有点鸡肋,所以我很少用这种方式
  3. Model数组配置IDE辅助提示时开发效率更高,并且内存占用相比纯数组array相差不大,所以建议用Model数组方式

开发建议

从开发效率和维护角度我建议选择Model数组的开发方式

因为在PhpStorm这个IDE中,Model的查询方法中加入注释 @return static[] 就可以有IDE字段辅助

当然前提是在相应Model的注释中加入属性注释 @property,下方给出几个示例

Model @property 示例

/**
* @property int $id 主键ID
* @property string $order_sn 订单号
*/
class OrderInfoModel extends Model
{
protected $table = 'order_info';
public $timestamps = false;
/**
* 查找订单
* @param string $sn
* @return static
*/
public function findBySn($sn)
{
return static::query()->where('order_sn', $sn)->first();
}
/**
* 查找订单列表
* @return static[]
*/
public function findListByPage($page, $pageSize)
{
return static::query()->forPage($page, $pageSize)->get()->all();
}
}
//注意两个方法的 @return 差别

使用方法

  • 以一个分页列表接口为例
class OrderController extends Controller
{
public function actionList(Request $request)
{
$page = $request->get('page', 1);
$pageSize = $request->get('size', 10);
$results = [];
$list = OrderInfoModel::singleton()->findListByPage($page, $pageSize);
if ($list) foreach ($list as $item) {
$results[] = ['order_sn' => $item->order_sn]; //在IDE中, 这个$item->order_sn是有辅助提示的,就是Model中的@property起的作用
}
//其他代码省略
}
}

Laravel Model查询结果的3种存储格式内存占用对比的更多相关文章

  1. Dynamics CRM2016 查询数据的三种方式的性能对比

    之前写过一个博客,对非声明验证方式下连接组织服务的两种方式的性能进行了对比,但当时只是对比了实例化组织服务的时间,并没有对查询数据的时间进行对比,那有朋友也在我的博客中留言了反映了查询的时间问题,一直 ...

  2. SparkSQL查询程序的两种方法,及其对比

    import包: import org.apache.spark.{SparkConf, SparkContext}import org.apache.spark.rdd.RDDimport org. ...

  3. PHP查询MySQL大量数据的内存占用分析

    这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于M ...

  4. php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误( 转载)

    php – Laravel 5查询关系导致“调用成员函数addEagerConstraints()on null”错误   我一直在尝试创建一个简单的用户管理系统,但在查询关系时不断遇到障碍.例如,我 ...

  5. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  6. Yii Ar model 查询

    Ar model 查询 参照表: CREATE TABLE tbl_user ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, username VA ...

  7. Hibernate 查询MatchMode的四种模式

    Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...

  8. 查询分页的几种Sql写法

    查询分页的几种Sql写法 摘自:http://www.cnblogs.com/zcttxs/archive/2012/04/01/2429151.html 1.创建测试环境,(插入100万条数据大概耗 ...

  9. laravel数据库查询返回的数据形式

    版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(), ...

随机推荐

  1. java如何将char类型的数字转换成int型的数字,而不是Ascii

    如何把 char ‘3’ 转为 int 3, 大家应该知道,不能直接转化,那样得到是‘3’的Ascii. 如下面: public class Leet { public static void mai ...

  2. html+css知识点以及常见的坑

    float 与 绝对定位 共同点:都脱离文档流,不占用原来的位置,后面的内容占有位置 不同点: float后者居上,补齐,且只能在父级盒子内活动,且不能浮动在照片上. 绝对定位脱离文档流后,直接漂浮到 ...

  3. Robust and Communication-Efficient Federated Learning from Non-IID Data

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. arXiv:1903.02891v1 [cs.LG] 7 Mar 2019 Abstra ...

  4. [CSP-S2019]树上的数 题解

    CSP-S2 2019 D1T3 考场上写了2h还是爆零……思维题还是写不来啊 思路分析 最开始可以想到最简单的贪心,从小到大枚举每个数字将其移动到最小的节点.但是通过分析样例后可以发现,一个数字在移 ...

  5. 焦大:seo思维进化论(番外)

    http://www.wocaoseo.com/thread-54-1-1.html 我已经在博客说了学seo研究算法是愚蠢的行为,但是很多人仍旧来问se的算法问题,其中最多的就是问TF-IDF算法, ...

  6. 手写@Service、@Autowired、@Transactional注解,实现spring ioc和spring事务

    自定义@Service注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Custom ...

  7. e3mall商城的归纳总结4之图片服务器以及文本编辑器

    一.图片服务器 --1.认识图片服务器 大家可能都知道在分布式架构中使用图片上传可能会导致文件存放在某一个项目,而我们的项目基本上都采用集群的方式 ,因此这样会导致图片的问题比较难以存放,在这里我们有 ...

  8. python实用小技能分享,教你如何使用 Python 将 pdf 文档进行 加密 解密

    上次说了怎么将word转换为pdf格式 及 实现批量将word转换为pdf格式(点击这里),这次我又get到一个新技能–使用 Python 将 pdf 文档进行 加密 解密,哈哈哈 希望帮到更多人! ...

  9. Apache Pulsar 在 BIGO 的性能调优实战(上)

    背景 在人工智能技术的支持下,BIGO 基于视频的产品和服务受到广泛欢迎,在 150 多个国家/地区拥有用户,其中包括 Bigo Live(直播)和 Likee(短视频).Bigo Live 在 15 ...

  10. oeasy教您玩转linux010102查看发行版

    查看发行版distro 回忆上次内容 从帮助咱们可以知道 name -a 可以得到全部信息 uname -a 从中,咱们知道有ubuntu,他好像是一种发行版. 那么,什么是发行版呢? 什么是发行版?