PHP TP5 省市區表多級關聯模型查詢,和db方式查詢封裝效率
阿新 • • 發佈:2019-01-27
需要對省市區 三張表進行查詢,將查詢結果 進行組裝成如下格式,便於前段js呼叫
使用TP5框架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:
<?php
namespace app\common\model;
use think\Model;
use think\Db;
class Province extends Model
{
public function cities()
{
return $this->hasMany('City','province')->order('id');
}
}
City:
<?php namespace app\common\model; use think\Model; class City extends Model { public function areas() { return $this->hasMany('Area','city','id')->order('id'); } }
Area:
<?php
namespace app\common\model;
use think\Model;
class Area extends Model
{
}
2. 在ProvinceSercice中,採用三種方式來實現資料查詢和封裝
<?php namespace 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中三種方式的效率
<?php
namespace 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,的執行效率最高!