解决thinkphp6读取sqlserver报Microsoft[SQL Server]对象名 ‘information_schema.tables‘ 无效错误

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

先感谢思路
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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值