一、COUNT()方法統計去重:
~~~
//鏈式操作最后是COUNT()方法結尾時,distinct要放到COUNT方法里面的字段參數前面才起統計去重作用
//錯誤的寫法:
$query->distinct(true)->field('ots.order_no')->where($map)->count();
//將生成這樣的sql
SELECT DISTINCT COUNT(*) AS think_count FROM `order_ticket_sell`
//正確的寫法:
$query->where($map)->count('distinct ots.order_no');
//將生成這樣的sql
SELECT COUNT(DISTINCT `ots`.`order_no`) AS think_count FROM `order_ticket_sell`
~~~
二、ThinkPHP3.2里面的WHERE的數組參數可以設置\_string來接收字符串查詢條件,跟數組查詢條件一起混合成一個數組傳給WHERE作為查詢條件。ThinkPHP6使用Db::raw()替代了\_string來實現混合查詢。
使用Db::raw()也可以對字段使用mysql函數:
~~~
//原來ThinkPHP3.2這樣寫的:
if(empty($count_type))
{
$map['sell_time'] = array(array('neq','null'),array('EGT',$dtBegin),array('ELT',$dtEnd))$tsort = 'order_ticket_sell.sell_time desc';
~~~
~~~
}
else
{
$map['_string'] = "CONCAT(tic_feature.date,' ',tic_feature.time)>='" . $dtBegin . "' and CONCAT(tic_feature.date,' ',tic_feature.time)<='" . $dtEnd . "'";
$tsort = 'tic_feature.date desc, tic_feature.time desc';
}
//現在ThinkPHP6可以改成這樣了:
if(empty($count_type)){
$key_map['sell_time'] = array('ots.sell_time', 'between', array($dt_begin,$dt_end));
$tsort = ['ots.sell_time'=>'desc'];
} else {
$tic_ft_raw = Db::raw("CONCAT(tic_f.date,' ',tic_f.time)");
$key_map['tic_ft_time'] = array($tic_ft_raw, 'between', [$dt_begin, $dt_end]);
$tsort = ['tic_f.date'=>'desc', 'tic_f.time'=>'desc'];
}
//ThinkPHP6不像ThinkPHP3.2的WHERE那樣能用關聯數組了,所以自己建個關聯數組來存放查詢條件,以便需要修改或刪除某個查詢條件的時候,可以使用關聯鍵方便的修改或UNSET掉關聯鍵。例如下面的查詢不需要pay_method這個查詢條件了:
UNSET($key_map['sell_time']);
~~~
~~~
//然后把刪掉了pay_method后的查詢條件再提出來,以便放到WHERE里去:
$map = array_values($key_map['sell_time']);
~~~
三、Query對象可以復用,只要修改WHERE查詢條件就可以了,這樣代碼冗余少些,效率也高些:
~~~
//如果是一直在復用最初創建的Query對象,記得要先removeOption('where'),然后再放到新調用的WHERE里去,否則不是更新WHRER條件,而是在原來的WHERE條件后面附加WHERE條件:
$key_map['pay_method'] = array('otd.pay_method','=',1); //會員卡支付
$map = array_values($key_map);
$ots_query->removeOption('where');
$cardpaytotal = $ots_query->where($map)->sum('price');
~~~
四、使用Db::raw的時候,有時會遇到這種錯誤“Invalid parameter number: number of bound variables does not match number of tokens”,換下單引號豪即可,不允許字符串用雙引號。
- thinkphp6執行流程(一)
- php中use關鍵字用法詳解
- Thinkphp6使用騰訊云發送短信步驟
- 路由配置
- Thinkphp6,static靜態資源訪問路徑問題
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳實踐
- Thinkphp6.0 搜索器使用方法
- 從已有安裝包(vendor)恢復 composer.json
- tp6with的用法,表間關聯查詢
- thinkphp6.x多對多如何添加中間表限制條件
- thinkphp6 安裝JWT
- 緩存類型
- 請求信息和HTTP頭信息
- 模型事件用法
- 助手函數匯總
- tp6集成Alipay 手機和電腦端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6筆記
- TP6(thinkphp6)隊列與延時隊列
- thinkphp6 command(自定義指令)
- command(自定義指令)
- 本地文件上傳
- 緩存
- 響應
- 公共函數配置
- 七牛云+文件上傳
- thinkphp6:訪問多個redis數據源(thinkphp6.0.5 / php 7.4.9)
- 富文本編輯器wangEditor3
- IP黑名單
- 增刪改查 +文件上傳
- workerman 定時器操作控制器的方法
- 上傳文件到阿里云oss
- 短信或者郵箱驗證碼防刷代碼
- thinkphp6:訪問redis6(thinkphp 6.0.9/php 8.0.14)
- 實現關聯多個id以逗號分開查詢數據
- thinkphp6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成帶logo的二維碼(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql數據庫使用事務(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,創建過濾IP的中間件
- 源碼解析請求流程
- 驗證碼生成
- 權限管理
- 自定義異常類
- 事件監聽event-listene
- 安裝與使用think-addons
- 事件與多應用
- Workerman 基本使用
- 查詢用戶列表按拼音字母排序
- 擴展包合集
- 查詢用戶數據,但是可以通過輸入用戶昵稱來搜索用戶同時還要統計用戶的文章和粉絲數
- 根據圖片的minetype類型獲取文件真實拓展名思路
- 到處excel
- 用imagemagick庫生成縮略圖
- 生成zip壓縮包并下載
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源碼分析三】 APP類之父, 容器Container類
- thinkphp6表單重復提交解決辦法
- 小程序授權
- 最簡單的thinkphp6導出Excel
- 根據訪問設備不同訪問不同模塊
- 服務系統
- 前置/后置中間件
- 給接口api做簽名驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- 6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 使用前后端分離的驗證碼(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分離:用jwt+middleware做用戶登錄驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分離多圖上傳
- thinkphp 分組、頁面跳轉與ajax
- thinkphp6 常用方法文檔
- 手冊里沒有的一些用法
- Swagger 3 API 注釋
- PHP 秒級定時任務
- thinkphp6集成gatewayWorker(workerman)實現實時監聽
- thinkphp6按月新增數據表
- 使用redis 實現消息隊列
- api接口 統一結果返回處理類
- 使用swoole+thinkphp6.0+redis 結合開發的登錄模塊
- 給接口api做簽名驗證
- ThinkPHP6.0 + UniApp 實現小程序的 微信登錄
- ThinkPHP6.0 + Vue + ElementUI + axios 的環境安裝到實現 CURD 操作!
- 異常$e
- 參數請求驗證自定義和異常錯誤自定義