PHP TP5 省市区表多级关联模型查询,和db方式查询封装效率
来源:互联网 发布:淘宝店铺转化率是什么 编辑:程序博客网 时间:2024/06/01 07:29
需要对省市区 三张表进行查询,将查询结果 进行组装成如下格式,便于前段js调用
array (size=34) 1 => array (size=4) 'id' => int 1 'name' => string '北京市' (length=9) 'code' => string '110000' (length=6) 'cities' => array (size=2) 1 => array (size=5) ... 2 => array (size=5) ... 2 => array (size=4) 'id' => int 2 'name' => string '天津市' (length=9) 'code' => string '120000' (length=6) 'cities' => array (size=2) 3 => array (size=5) ... 4 => array (size=5) ... ...
实现代码:
1. model:建立关联
Province:
<?phpnamespace app\common\model;use think\Model;use think\Db;class Province extends Model{ public function cities() { return $this->hasMany('City','province')->order('id'); }}City:
<?phpnamespace app\common\model;use think\Model;class City extends Model{ public function areas() { return $this->hasMany('Area','city','id')->order('id'); }}
Area:
<?phpnamespace app\common\model;use think\Model;class Area extends Model{}
2. 在ProvinceSercice中,采用三种方式来实现数据查询和封装
<?phpnamespace app\common\service;use think\Db;abstract class ProvinceService{ /** * 获取省市区 Array * @return ModelList */ public static function getProvinceJSONstr() { $provinceModel =new \app\common\model\Province(); $provinceList = $provinceModel->with('cities.areas')->select(); return $provinceList; } /** * 获取省市区 Array * @return Array */ public static function getProvinceJSONStr2() { //================= 省市区数据获取 =========== // 减少不必要的sql查询,特采用db方式查询 而非采用关联模型 $provinceList = Db::name('province') ->alias('p') ->join('city c','p.id = c.province','LEFT') ->join('area a','c.id = a.city','LEFT') ->field('p.id,p.name,p.code,c.id as city_id,c.name as city_name,c.code as city_code, a.id as area_id,a.name as area_name,a.code as area_code') ->order(['p.id','c.id','a.id']) ->select(); $provinceArray = []; foreach($provinceList as $val) { $provinceArray[$val['id']]['code'] = $val['code']; $provinceArray[$val['id']]['name'] = $val['name']; $provinceArray[$val['id']]['cities'][$val['city_id']]['city_code'] = $val['city_code']; $provinceArray[$val['id']]['cities'][$val['city_id']]['city_name'] = $val['city_name']; $provinceArray[$val['id']]['cities'][$val['city_id']]['areas'][$val['area_id']] = [ 'area_name' => $val['area_name'], 'area_code' => $val['area_code'] ]; } return $provinceArray; } //================= 省市区数据获取 =========== // 减少不必要的sql查询,特采用db方式查询 而非采用关联模型 public static function getProvinceJSONStr3() { $provincelist = Db::name('province') ->order('id') ->select(); $citylist = Db::name('city') ->order('id') ->select(); $arealist = Db::name('area') ->order('id') ->select(); $provinceArray = []; $cityArray = []; $areaArray = []; foreach($arealist as $area) { $areaArray[$area['city']][$area['id']] = $area; } foreach($citylist as $city) { $city['areas'] = isset($areaArray[$city['id']]) ? $areaArray[$city['id']] : null; $cityArray[$city['province']][$city['id']] = $city; } foreach($provincelist as $province) { $province['cities'] = isset($cityArray[$province['id']]) ? $cityArray[$province['id']] : null; $provinceArray[$province['id']]= $province; } return $provinceArray; }}
3.在Controller中执行,计算service中三种方式的效率
<?phpnamespace app\index\controller;use think\Controller;class Index extends Controller{ public function index() { //程序运行时间 $starttime = explode(' ',microtime()); echo microtime(); //$md = 'getProvinceJSONStr'; //$md = 'getProvinceJSONStr2'; $md = 'getProvinceJSONStr3'; $provinces = \app\common\service\ProvinceService::$md(); $provinces = \app\common\service\ProvinceService::$md(); $provinces = \app\common\service\ProvinceService::$md(); $provinces = \app\common\service\ProvinceService::$md(); $provinces = \app\common\service\ProvinceService::$md(); dump($provinces); //程序运行时间 $endtime = explode(' ',microtime()); $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]); $thistime = round($thistime,6); echo "本网页执行耗时:".$thistime." 秒。".time(); }}
将ProvinceSercice中,1.关联模型查询 2.Db执行sql关联查询 3.sql普通查询,对结果手动封装
这三个方法 都执行 5 次,打印结果,计算执行时间()
方法1:本网页执行耗时:1.934399 秒;(左右)
方法2:本网页执行耗时:0.190413 秒;(左右)
方法3:本网页执行耗时:0.135423秒;(左右)
可以发现 :方法3,的执行效率最高!
阅读全文
1 0
- PHP TP5 省市区表多级关联模型查询,和db方式查询封装效率
- mybatis多级关联查询数据封装
- mybatis多级关联查询数据封装
- 子查询和关联查询 效率
- 提高多表关联数据查询效率
- tp5 数据查询和分页
- tp5查询
- tp5中的模型关联
- 查询省市区,转成 json 表
- jdbc关联模型查询-多表查询返回结果集
- 数据库多表关联查询效率问题解决方案
- 关联和非关联查询
- Hibernate查询方式及关联
- TP5 like模糊查询
- tp5闭包子查询
- 关联查询(多表查询)
- Laravel5 关联查询 —— 多级一对多的实现
- select_resultMap_关联查询_association定义关联对象封装规则,关联查询_分步查询&延迟加载
- LocalStorage存储JSON对象的问题
- mybatis之入门到开发(三)之常用对象SqlSessionFactory和SqlSession,动态sql,输入映射和输出映射
- Ubuntu命令行下MySQL数据导出与导入
- javascript jssdk退出微信的方法
- 关于metasploit下连接postgresql数据库问题
- PHP TP5 省市区表多级关联模型查询,和db方式查询封装效率
- Serializable和Externalizable序列化反序列化
- NYOJ 135 取石子(二)(巴什博奕+尼姆博弈)
- 罗马字符与整数互转
- 如何获取富文本框中的内容
- ibatis&mybatis组装动态查询&排序
- 判断浏览器内核
- 购物车必备全选反选
- NAPT和NAT的工作原理及其区别