先感谢思路
https://weiku.co/article/37/
需要修改thinkphp里面sqlserver数据库驱动,不要去改composer里面的东西。所以只能自己重写驱动,并且在database.php配置文件中,显示指定builder和type参数来完成非侵入式的修改。
'sqlserver' => [
// 这两个配置需要指定对应的文件
'builder' => '\app\common\driver\builder\FunSqlsrv',
'type' => '\app\common\driver\connector\FunSqlsrv',
//下面配置都是正常写
// 'type' => env('yifei_database.type', 'sqlsrv'),
// 服务器地址
'hostname' => env('yifei_database.hostname', ''),
// 数据库名
//不同账套不一样,需要配置一下
'database' => env('yifei_database.database', ''),
// 数据库用户名
'username' => env('yifei_database.username', ''),
// 数据库密码
'password' => env('yifei_database.password', ''),
// 数据库连接端口
'hostport' => env('yifei_database.hostport', '1433'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('yifei_database.charset', 'utf8'),
// 数据库表前缀
'prefix' => '',
// 增加证书信任
'trust_server_certificate'=>true,
],
2个核心文件代码
FunSqlsrv.php
<?php
namespace app\common\driver\builder;
use think\db\Builder;
use think\db\exception\DbException as Exception;
use think\db\Query;
use think\db\Raw;
/**
* Sqlsrv数据库驱动
*/
class FunSqlsrv extends Builder
{
/**
* SELECT SQL表达式
* @var string
*/
protected $selectSql = 'SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER (%ORDER%) AS ROW_NUMBER FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%) AS thinkphp) AS T1 %LIMIT%%COMMENT%';
/**
* SELECT INSERT SQL表达式
* @var string
*/
protected $selectInsertSql = 'SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%';
/**
* UPDATE SQL表达式
* @var string
*/
protected $updateSql = 'UPDATE %TABLE% SET %SET% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%';
/**
* DELETE SQL表达式
* @var string
*/
protected $deleteSql = 'DELETE FROM %TABLE% %USING% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%';
/**
* INSERT SQL表达式
* @var string
*/
protected $insertSql = 'INSERT INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%';
/**
* INSERT ALL SQL表达式
* @var string
*/
protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%';
/**
* order分析
* @access protected
* @param Query $query 查询对象
* @param mixed $order
* @return string
*/
protected function parseOrder(Query $query, array $order): string
{
if (empty($order)) {
return ' ORDER BY rand()';
}
$array = [];
foreach ($order as

本文介绍如何为ThinkPHP框架定制SQLServer数据库驱动,通过重写核心组件实现特定需求,如调整SQL语法、优化查询性能等。
最低0.47元/天 解锁文章
1351






