Yii2框架踩坑记录-数组数据渲染到后台页面带分页

不得不说Yii框架还是一个非常高效的框架,Gii扩展能生成简单的CRUD操作,问题也就出在这里,我的数据不是直接从单独的表出来的,需要连查,需要递归操作

PM前两天说的是统计一下这段时间用户的邀请人数,好,没问题,写个脚本自动定时跑吧

测试以后没有问题就给推到线上去了,PM是不可能不给需求的

好,给后台加上一个直推人数排名,WTF?不是有直推人数的字段吗?我要指定时间段的数据~

不要给我说什么底层原理、框架内核!老夫敲代码就是一把梭!Ctrl+C Ctrl+V 拿起键盘就是干!

先去把我脚本的代码复制过来

$orderModel = new OrderModel;
$orders = $orderModel::find()
    ->joinWith('orderGoods')
    ->joinWith('user')
    ->Where(['>=','{{%order}}.pay_at',$startTime])
    ->andWhere(['<','{{%order}}.pay_at',$endTime])
    ->andWhere(['{{%order_goods}}.acttype'=>1])
    ->andWhere(['>','{{%user}}.inv_id',0])
    ->andWhere(['in', '{{%order}}.status', [2,3,4]])
    ->all();
$invArr = $this->getInvId($orders); // 得到在regtime之后 注册用户的inv_id
$invNums = array_count_values($invArr);  // 返回一个数组,该数组用数组中的值作为键名,该键值是在数组中出现的次数
arsort($invNums);

getInvId方法就是之前说递归的时候的方法,得到数组$invNums,该数组用$invArr数组中的值作为键名,该键值是在数组中出现的次数

因为要在后台显示,最好还是给它一个键名,循环一下

$info = [];
foreach ($invNums as $key => $value) {
    $info[]=['user_id'=>$key,'nums'=>$value];
}

ok,转成了二维关联数组,下一步操作:渲染到后台页面,分页

这就体现Yii的方便了,数据提供者类,之前都是从数据库查询数据并且以数组项的方式或者Active Record实例的方式返回,直接实例化ActiveDataProvider类就行了

结果我使用这个报错,The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.

意思是query属性必须是实现QueryInterface的类的实例,例如使用yii\db\Query或者yii\db\ActiveQuery,所以不能用这个去渲染数据到页面上

查看了一下手册,发现有一个 yii\data\ArrayDataProvider类,将一个大的数组依据分页和排序规格返回一部分数据

use yii\data\ArrayDataProvider;

$provider = new ArrayDataProvider([
    'allModels' => $info,
    'pagination' => [
        'pageSize' => 15,
    ],
    'sort' => [
        'attributes' => ['nums'],
    ],
]);

应该指定 allModels 属性作为一个大的数组, 这个大数组的元素既可以是一些关联数组也可以是一些对象,所以把我们的数组$info扔进去,同样的方式去刷新页面,ok,值有了

但是有个问题,数组数据提供者与Active Data ProviderSQL Data Provider这两者进行比较的话, 会发现数组数据提供者没有后面那两个高效,这是因为数组数据提供者需要加载所有的数据到内存中,2w条数据,在本地连接远程库,30s读取。推到测试服务器上,3s读取数据,还凑合,就先这样吧

参考资料

显示数据(Displaying Data): 数据提供器(Data Providers)- Yii Framework 中文网

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:Yii2框架踩坑记录-数组数据渲染到后台页面带分页

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

AngularJS Providers 详解

供应者(Providers) ? Each web application you build is composed of objects that coll...

23350
来自专栏坚毅的PHP

雅美尓(yaml)实战

献给跟我一样对yaml(雅美尓)有婶婶挫败感的同学!         开始第一个pylon工程,我们就跟yaml配置文件开始了不解之缘。yaml是什么?它有哪些...

56380
来自专栏jouypub

修改MYSQL中group_concat的长度限制

在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,

1.5K20
来自专栏Android机动车

单例模式的六种花式写法

单例模式是一种常用的设计模式,其定义是单例对象类只允许一个实例存在,实现的核心原理是构造函数私有化。使用单例可以节省内存开销,也是现实场景中的一种映射,比如一台...

17120
来自专栏Spring相关

第3章—高级装配—bean的作用域

单例是默认的作用域,但是正如之前所描述,对于易变的类型,这并不合适.如果选择其他作用域,要使用@Scope注解,他可以和@Component或@Bean一起使用...

10320
来自专栏小小挖掘机

一文读懂Python多线程

1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 ? 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间...

42750
来自专栏Java后端技术栈

Java多线程编程-(12)-单例模式几种写法的错与对

在所有的主流23中设计模式中,单例模式作为最简单也最容易理解也是使用最普遍的设计模式,他是一种对象创建模式,用于产生一个对象的具体实例,他可以确保系统中一个类只...

9520
来自专栏腾讯Bugly的专栏

Android 平台 Native 代码的崩溃捕获机制及实现

一、背景 在Android平台,native crash一直是crash里的大头。native crash具有上下文不全、出错信息模糊、难以捕捉等特点,比jav...

1.3K70
来自专栏程序员同行者

django rest framework serializers解读

serializers.fieild 我们知道在django中,form也有许多field,那serializers其实也是drf中发挥着这样的功能。我们...

24610
来自专栏编舟记

如何在@SpringBootTest中动态地启用不同的profiles

这个类存在的意义就是为了让其它类别的 ResourceTest 继承它,并在一次启动当中运行完所有的集成测试。避免每个 ResourceTest 都初始化启动 ...

30030

扫码关注云+社区

领取腾讯云代金券