您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
5-3 数据模型之单表查询(batch)
发布时间:2023-04-27 23:34:06编辑:雪饮阅读()
-
配置数据库
数据库配置于如D:\phpstudy_pro\WWW\www.xyyii.com\basic\config\db.php中
配置主要是dsn方式,基本你一眼就看懂了。
配置模型
模型路径位于如
D:\phpstudy_pro\WWW\www.xyyii.com\basic\models
路径下
假如说我的数据库中某个表名如
wp_posts
则我要建立的对应模型应该是如WpPosts.php
<?php
namespace app\models;
use yii\db\ActiveRecord;
class WpPosts extends ActiveRecord{
}
查询数据
查询数据这里是有分很多种的:
普通的findBySql
findBySql支持预处理
find+where查询(以及大于、区间、模糊)
查询结果转数组
批量查询batch
那么这些具体的实例如:
<?php namespace app\controllers; use app\models\WpPosts; use yii\web\Controller; class HelloController extends Controller{ public $layout='common'; public function actionIndex(){ /* * 查询数据(虽然sql里面也指定了表名,其实人要灵活起来嘛, * 虽然是用模型来查,但是也支持原生sql,则可以直接指定表名, * 只是这样做感觉很奇怪,一般不是很建议) * */ echo "查询数据:<br/>"; $sql="select * from wp_posts where id=1"; print_r(WpPosts::findBySql($sql)->all()); /* * 不能直接调用index2方法,不晓得为什么执行第二个findBySql时候就查询出来的数据就变成乱码了, * 但是分开两个方法访问就不会mmp的,我个人理解是这两个结果集的数据合在一起时候有什么编码冲突吧 * 这里暂时先不解决,因为实际业务场景一般很难出现就是说刚一个普通查询,然后接着就是一个预处理查询。。。 * */ //$this->actionIndex2(); } public function actionIndex2(){ //预处理查询数据能避免sql注入,比如例如"1 or 1=1"这样的值来拼接这种 echo "查询数据(预处理):<br/>"; print_r(WpPosts::findBySql("select * from wp_posts where id=:id",[":id"=>1])->all()); } public function actionIndex3(){ /*使用find+where的时候可以不用指定表了,因为直接就是所用模型对应的表 并且默认没有指定字段与筛选值之间的关系时候,则是相等的筛选关系 例如这里这个就是相当于id=1 * */ echo "查询数据(find+where):<br/>"; print_r(WpPosts::find()->where(["id"=>1])->all()); } public function actionIndex4(){ echo "查询数据(find+where)(大于):<br/>"; print_r(WpPosts::find()->where([">","id",1])->all()); } public function actionIndex5(){ echo "查询数据(find+where)(between):<br/>"; print_r(WpPosts::find()->where(["between","id",1,2])->all()); } public function actionIndex6(){ //这里like查询相当于是直接"%keyword%"就是关键词左右都是模糊,而不是单独左边模糊或者单独右边模糊 echo "查询数据(find+where)(like):<br/>"; print_r(WpPosts::find()->where(["like","post_title",'世'])->all()); } public function actionIndex7(){ /* 说是查询结果转数组会优化内存消耗,我的理解是对象的结果集确实非常占用内存,那么将对象结果集转换为数组结果集后释放掉对象结果集以节省内存 但有个极端情况就是说假如数据非常庞大(可能是条目数量多,也可能是每条数据比较大,这里我没有细想)时候,是不是对象转换为数组的这个过程本身就消耗的内存非常高呢, 以至于还没有转换成功,则内存就先消耗完了呢? * */ echo "查询数据(find+where)(between)(查询结果转数组):<br/>"; print_r(WpPosts::find()->where(["between","id",1,2])->asArray()->all()); } public function actionIndex8(){ /* 批量查询 我的理解就相当于是有点类似分页的效果,但是分页是每次只查询单一页的 批量查询应该是查询所有的,但是如果直接查询所有则会导致内存不够用 那么应该是每个分页(感觉叫分组更合适)查询结束后,则该分组的内存就释放了 那么如此一来总占用内存仅仅只是一个分组的大小了,但如此一来我则又想到一个坏的情况 因为毕竟对于请求来说一般都是会有请求超时的情况的,何况前端未必能接受的了这么久的等待吧 那么假如说是能够接受这个时长的等待,那么我觉得这里的实现原理应该是与数据库之间的临时长连接 因为如果按正常逻辑来说,每组查询都是一次数据库连接,那么这样的设计虽然节约了php的内存开销 却增加了mysql的连接数资源占用,那么这里的应用场景我猜测应该是异步的 但是经过我sql追踪器发现好像不太是这样的,然后再经过我追踪batch函数 我的新理解是内部实现应该是这样的: 查询结果集是一个资源,该资源仅仅以Iterator组成一个可迭代对象(数组),有点像是引用指针形成的数组 就是说并没有直接把数据取出来 我的理解3: 看了好多资料现在反而更混乱了,但是我觉得应该是与 1、$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 2、Iterator 这两个关键的家伙密切 重点:MYSQL_ATTR_USE_BUFFERED_QUERY设置为false就关闭了缓存到内存,而直接操作结果集,结果集就是Iterator可迭代对象 * */ foreach(WpPosts::find()->batch(2) as $tests){ print_r(count($tests)); } } }
关键字词:batch
上一篇:4-6 视图之数据块
下一篇:5-4 数据模型之单表删除
相关文章
-
无相关信息