1. 程式人生 > >thinkphp5 模型關聯和快取簡單實踐

thinkphp5 模型關聯和快取簡單實踐

模型關聯

模型關聯還是一個非常方便的一個功能,尤其是查詢一個數據需要多個表連線的時候,拼接的sql語句很長,讓人很頭疼,不過tp5的模型關聯正好解決了這個問題。

直接上程式碼

資料庫

sell表
這裡寫圖片描述

country表
這裡寫圖片描述

其中sell表中的place對應著country表中的id

接著建立sell表的模型SellModel和country表的模型CountryModel,

CountryModel

<?php
namespace app\home\model;
use think\Model;
class CountryModel extends Model{



    protected
$table="country"; }

SellModel

<?php
namespace app\home\model;
use think\Model;

class SellModel extends Model{

    protected $table="sell";
    protected $autoWriteTimestamp=true;






    function country(){



       return $this->belongsTo('CountryModel','place','id');
    }





}

belongsTo(‘關聯模型名’,’外來鍵名’,’關聯表主鍵名’,[‘模型別名定義’],’join型別’);

SellModel中有一個關聯方法,關聯到CountryModel,如果模型不在同一個模組,要新增上名稱空間。
還有就是關於hasOne和belongTo的區別在於外來鍵在哪個表中,如果在本表就用belongTo,反之hasOne,
我的外來鍵是place,在本表中,所以用belongTo。

試一下效果

在控制器中

$res=SellModel::all();



        foreach ($res as $v){


            dump($v
->name); dump($v->country->zh_name); }

效果
這裡寫圖片描述
把sell表中的name和對應到country表中的zh_name查找出來,這麼寫很方便

但是通過trace除錯可以看到,查詢的效率並不是很高,尤其是查詢資料多的時候,效率更低
這裡寫圖片描述
每次通過關聯方法訪問關聯表的時候,都會產生一條sql語句

這個時候就要用到關聯預載入來提高效率了

$res=SellModel::with('country')->select();



        foreach ($res as $v){


            dump($v->name);

            dump($v->country->zh_name);


        }

列印效果是一樣的,再看看執行的sql語句
這裡寫圖片描述
這個效率就比沒用預載入的高多了

還有一個延遲預載入

        $res=SellModel::all();


        $arr=load_relation($res,'country');


        foreach ($arr as $v){


            dump($v->name);

            dump($v->country->zh_name);

        }

    }

是當需要關聯的時候,用load_relation呼叫關聯方法,load_relation是處理陣列,load是處理資料集

最後再用快取優化一下

        //判斷是否有這個快取,就對這個快取賦值
        Cache::remember('sell_list',function (){

            return SellModel::with('country')->select();
        });


        dump(Cache::get('sell_list'));

當然,根據自己的業務邏輯,在有更新和新增操作的時候,快取也要相應的更新一下。