如何为Laravel中所有Eloquent及原生查询统一配置SQL Server连接参数
Laravel SQL Server全局连接属性设置最优方案
核心实现思路
利用Laravel官方的连接建立事件实现全局设置,仅在数据库连接创建完成时执行一次属性配置,所有后续查询(包括Eloquent、查询构造器、原生查询)都会继承该连接属性,性能损耗极低,是目前兼容性和实用性最好的方案。
具体实现步骤
步骤1:注册事件监听
打开app/Providers/EventServiceProvider.php,在$listen属性中添加事件和对应监听器的绑定:
protected $listen = [ \Illuminate\Database\Events\ConnectionEstablished::class => [ \App\Listeners\ConfigureSqlServerConnection::class, ], ];
步骤2:创建监听器
执行Artisan命令生成监听器文件:php artisan make:listener ConfigureSqlServerConnection
打开生成的app/Listeners/ConfigureSqlServerConnection.php,编写配置逻辑:
<?php namespace App\Listeners; use Illuminate\Database\Events\ConnectionEstablished; class ConfigureSqlServerConnection { public function handle(ConnectionEstablished $event) { // 仅对SQL Server驱动执行配置 if ($event->connection->getDriverName() !== 'sqlsrv') { return; } $event->connection->statement(" SET NOCOUNT ON; SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET ARITHABORT ON; SET CONCAT_NULL_YIELDS_NULL ON; SET NUMERIC_ROUNDABORT OFF; SET QUOTED_IDENTIFIER ON; "); } }
方案优势
- 全局覆盖:所有走Laravel sqlsrv连接的查询都会生效,无需修改业务代码
- 性能优秀:仅在连接建立时执行一次SET语句,不会给每次查询增加额外开销
- 兼容性好:支持Laravel 5.5及以上所有版本,不需要额外安装扩展
- 易于维护:后续需要新增连接属性时,直接在监听器的SQL语句中补充即可
旧版Laravel兼容方案
如果你使用的是5.5以下不支持ConnectionEstablished事件的Laravel版本,可以直接在数据库配置中添加初始化命令,打开config/database.php找到sqlsrv配置块:
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'prefix' => '', 'options' => [ PDO::SQLSRV_ATTR_DIRECT_QUERY => true, // 连接初始化执行的属性配置 'init_command' => " SET NOCOUNT ON; SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET ARITHABORT ON; SET CONCAT_NULL_YIELDS_NULL ON; SET NUMERIC_ROUNDABORT OFF; SET QUOTED_IDENTIFIER ON; " ], ],
内容的提问来源于stack exchange,提问作者Phil.Coding
相关产品推荐
相关产品推荐

