thinkphp5 模型關聯和快取簡單實踐
阿新 • • 發佈:2019-02-18
模型關聯
模型關聯還是一個非常方便的一個功能,尤其是查詢一個數據需要多個表連線的時候,拼接的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'));
當然,根據自己的業務邏輯,在有更新和新增操作的時候,快取也要相應的更新一下。