tp5 使用技巧(持續更新中...)
1、自動寫入時間 create_time和update_time
使用save方法才行,如果使用insert方法的話,是不生效的,前者走的是model,后者走的是query
2、過濾字段 allowfield和strict方法
allowfield()方法配合save方法,
strict()方法配合insert方法,與上一條同理
3、save和update的區別
save和update本身也沒什么區別,更新條件也不局限於主鍵id,只不過是update 和create一樣,是model中的靜態方法,而save不是
4、跨模型,有點像是遠程一對多關聯的替代
1 $list = self::with(['album','album.Image']) 2 ->where('type','neq',2)//合伙人不顯示
3 ->where($where) 4 ->order("type DESC,login_num DESC") 5 ->page($page, $pageSize) 6 ->select();
5、模型事件,參考文檔:tp5的事件
1 //修改事件
2 protected static function init() 3 { 4 //如有變更積分
5 self::beforeUpdate(function ($row) { 6 $changedata = $row->getChangedData(); 7 if (isset($changedata['score'])) { 8 $origin = $row->getOriginData(); 9 ScoreLog::create(['user_id' => $row['id'], 'score' => $changedata['score'] - $origin['score'], 'before' => $origin['score'], 'after' => $changedata['score'], 'memo' => '商城分紅改變積分']); 10 } 11 }); 12 }
調用方式如下:
1 $score = bcmul($bonus,$vvv); 2 if ($score) { 3 $row = $user_model->get($kkk); 4 $data = $row->getOriginData(); 5 $score_before = $data['score']; 6 $row->validate(false)->allowField(true)->save(['score'=>$score + $score_before]); 7 }
如果想要在模型事件里增加傳參,只需要往$row對象里多賦值一個屬性就好了
6、全局查詢范圍
在手冊中,從5.0.4開始,支持各種事件查詢,包括add、update、delete以及select、find,示例4就是一個簡單的before_update事件,但是before_select不知為何沒效果(有效果后續再改,哈哈)
所以,遇到該模型查詢條件一致的時候,就用到了base()方法
1 // 定義全局base
2 protected function base($query) 3 { 4 $query->where('1=1'); 5 }
在手冊中,也有關於全局查詢范圍的說明:查詢范圍
在此補充一下,之前遇到一種情況,就是一開始沒加delete_time,后來又加上了,但是接口沒加啊,如果每個查詢接口改太費勁了,因為還有關聯,如果查詢都是從model獲取數據的話,那還簡單,但是遇到model一多也費勁,所以全局查詢范圍的優點就顯示出來了,可以在接口model繼承的basemodel中,統計增加一個base方法(起名就是base,別的不認),代碼如下:
1 /** 2 * 設置全局查詢范圍 3 * author:cyf 4 * time:2020-01-03 20:39 5 * @param $query 6 */
7 public function base($query) 8 { 9 $fields = $query->getTableFields(); 10 if (in_array('delete_time',$fields)) { 11 $query->where($query->getTable().'.delete_time is null or '.$query->getTable().'.delete_time = 0'); 12 } 13 }
備注:$query->getTableFields();//獲取當前數據表字段信息,$query->getTable();//獲取當前數據表名稱,帶前綴的,詳細可以(new query())->getTable()查看