1. 程式人生 > >PHP TP5 省市區表多級關聯模型查詢,和db方式查詢封裝效率

PHP TP5 省市區表多級關聯模型查詢,和db方式查詢封裝效率

      需要對省市區 三張表進行查詢,將查詢結果 進行組裝成如下格式,便於前段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)
              ...
     ...
      使用TP5框架
實現程式碼:

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,的執行效率最高!