2026/9/24 11:40:27

在 SQL Server 上使用 Laravel Illuminate Database:从 Capsule 独立封装到 Eloquent ORM 实战指南

在 SQL Server 上使用 Laravel Illuminate Database:从 Capsule 独立封装到 Eloquent ORM 实战指南 示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载导读本文以 Microsoft SQL Server 官方示例仓库中 laravel 示例应用Myboard 待办看板所依赖的 Illuminate Database 组件文档 为主体系统讲解 Laravel 数据库层的完整技术栈独立于框架使用的Capsule 管理器、流式查询构造器、Schema 构建器与Eloquent ORM并结合仓库源码剖析其连接 SQL Server 的底层机制DSN 生成、PDO 驱动选择、事务语义。读完本文你将掌握如何在不依赖完整 Laravel 框架的情况下用 Illuminate Database 直连 SQL Server也能够在 Laravel 应用中正确配置sqlsrv连接并完成迁移与 CRUD。Illuminate Database既是 Laravel 的数据库内核也是可独立使用的工具包Illuminate Database 是 Laravel PHP 框架的数据库层组件同时也是一个可以脱离框架单独分发的完整数据库工具包。组件文档开门见山地给出了它的能力边界README.md提供富有表达力的查询构造器expressive query builder支持链式where、orderBy、join等操作提供ActiveRecord 风格的 ORM——即 Eloquent通过模型类直接映射数据表提供Schema 构建器用 PHP 代码声明式地建表、改表当前内置支持MySQL、Postgres、SQL Server、SQLite四种数据库。在本仓库的 laravel 示例中composer.json 声明了laravel/framework: 5.1.*并运行在 PHP 7 之上通过 Microsoft PHP SQL Server Driver 与 Microsoft ODBC SQL Server Driver 连接 SQL Server。这意味着 Illuminate Database 的完整能力——Capsule、查询构造器、Schema 构建器、Eloquent——都可以直接作用于 SQL Server 实例。用 Capsule 在 Laravel 之外使用 Illuminate Database组件文档的核心场景是你不想引入整个 Laravel 框架只想用它的数据库能力。这时 Capsule胶囊管理器就是官方推荐的入口。Capsule 的目标是“把配置库并用于 Laravel 框架之外这件事变得尽可能简单”README.md。最小可运行示例use Illuminate\Database\Capsule\Manager as Capsule; $capsule new Capsule; $capsule-addConnection([ driver mysql, host localhost, database database, username root, password password, charset utf8, collation utf8_unicode_ci, prefix , ]); // 设置 Eloquent 模型使用的事件分发器...可选 use Illuminate\Events\Dispatcher; use Illuminate\Container\Container; $capsule-setEventDispatcher(new Dispatcher(new Container)); // 让这个 Capsule 实例可通过静态方法全局访问...可选 $capsule-setAsGlobal(); // 启动 Eloquent ORM...可选除非你已调用 setEventDispatcher() $capsule-bootEloquent();Capsule 的源码级工作流程从 Capsule\Manager.php 的实现可以看到它的启动序列构造函数创建或注入一个 IoC 容器Container随后调用setupDefaultConfiguration()与setupManager()setupDefaultConfiguration()设置默认取行模式PDO::FETCH_OBJ与默认连接名defaultsetupManager()构建ConnectionFactory并由此创建DatabaseManager——也就是说Capsule 内部复用的正是 Laravel 全栈场景下的同一套连接管理机制addConnection(array $config, $name default)把连接配置写入容器的database.connections数组支持为同一 Capsule 注册多个命名连接bootEloquent()把DatabaseManager注册为 Eloquent 的 connection resolver并把事件分发器若已设置注册为 Eloquent 的事件分发器使模型事件如 observer、创建/更新回调得以工作__callStatic魔术方法把未定义的静态调用转发到默认连接这是Capsule::table()、Capsule::select()能直接可用的根本原因。组件文档特别标注了一条依赖前提需要使用 Eloquent observer 时必须额外安装illuminate/events包composer require illuminate/events因为事件分发器来自该独立包。配置参数逐项解读addConnection的配置数组是连接一切的基础。以文档中的 MySQL 配置为例逐项说明参数示例值说明drivermysql数据库驱动类型。支持mysql、pgsql、sqlsrv、sqlitehostlocalhost数据库服务器地址databasedatabase数据库名usernameroot登录用户名passwordpassword登录密码charsetutf8连接字符集MySQL/Postgres 常用collationutf8_unicode_ci排序规则MySQL 常用prefix表前缀为空表示不使用前缀在本仓库 laravel 应用中sqlsrv连接配置位于 config/database.php结构完全一致sqlsrv [ driver sqlsrv, host 10.211.55.5, database env(DB_DATABASE, demotekdb), username env(DB_USERNAME, sa), password env(DB_PASSWORD, channelV1), prefix , ],注意其中database、username、password均通过env()读取分别对应.env中的DB_DATABASE、DB_USERNAME、DB_PASSWORD并提供了默认值——这是 Laravel 应用推荐的做法避免把凭据硬编码进配置文件。同一个文件中还保留了sqlite、mysql、pgsql的完整连接模板含charset、collation、strict、schema等扩展参数并默认default env(DB_CONNECTION, sqlsrv)即该示例应用默认使用 SQL Server 连接。对于 SQL ServerSqlServerConnector还额外支持port与appname两个可选参数设置port时会在 DSN 中拼接端口号设置appname时对应 DSN 中的APP项见下文源码分析。三种核心数据库 API查询构造器Query Builder注册好 Capsule 后即可使用静态代理调用查询构造器$users Capsule::table(users)-where(votes, , 100)-get();Capsule::table()经由静态转发取得默认连接的查询构造器where(votes, , 100)会被编译为带参数绑定的 SQL防止注入get()返回结果集合。原生 SQL 查询与 Laravel 的DB门面一致Capsule 也直接暴露原生查询方法$results Capsule::select(select * from users where id ?, array(1));select()第一个参数是原生 SQL第二个参数是绑定参数数组?占位符会被安全地替换。这类方法由__callStatic转发到连接实例执行。Schema 构建器用 PHP 代码声明式地建表Capsule::schema()-create(users, function($table) { $table-increments(id); $table-string(email)-unique(); $table-timestamps(); });increments(id)生成自增主键string(email)-unique()生成带唯一索引的字符串列timestamps()自动生成created_at/updated_at两个时间戳列。Schema 构建器会依据当前连接驱动如SqlServerGrammar把这些声明编译成对应的CREATE TABLE语句——这正是“同一套代码适配多数据库”的关键。Eloquent ORMEloquent 模型只需继承基类即可获得全部能力class User extends Illuminate\Database\Eloquent\Model {} $users User::where(votes, , 1)-get();模型按类名推断表名User→users。在本仓库的 laravel 示例中app/Todo.php 展示了 Eloquent 模型的标准写法class Todo extends Model { protected $table todos; // 显式指定表名 protected $fillable [name, user_id]; // 允许批量赋值的字段防 Mass Assignment protected $casts [complete boolean]; // 属性类型转换 }$fillable白名单机制用于防护批量赋值漏洞$casts则让complete字段在读取时自动转换为布尔型——这些正是把 SQL Server 中的 BIT 字段映射到 PHP 布尔值的实用手法。源码级原理Illuminate Database 如何连接 SQL Server驱动分发ConnectionFactoryConnectionFactory.php 负责把配置变成真实连接createConnector()根据driver分发mysql→MySqlConnector、pgsql→PostgresConnector、sqlite→SQLiteConnector、sqlsrv→SqlServerConnector未指定driver或遇到未知驱动会抛出InvalidArgumentException“A driver must be specified.” / “Unsupported driver [...]”createConnection()同样按driver返回对应的连接实现类sqlsrv对应SqlServerConnectionmake()中若配置含read键则创建读写分离连接createReadWriteConnection读连接的主机数组支持随机挑选——该机制同样适用于 SQL Server 的只读副本场景。DSN 生成sqlsrv 与 dblib 双路径SqlServerConnector.php 是 SQL Server 连接的咽喉它根据当前 PHP 环境可用的 PDO 驱动自动选择 DSN 格式若PDO::getAvailableDrivers()包含dblib即安装了 FreeTDS则走getDblibDsn()生成形如dblib:hostHOST;dbnameDB的 DSN否则走getSqlSrvDsn()生成形如sqlsrv:ServerHOST;DatabaseDB;APPappname的 DSN主机与端口用逗号分隔buildHostString($config, ,)。同时该类定义了默认 PDO 选项ATTR_CASE CASE_NATURAL保留列名原始大小写、ATTR_ERRMODE ERRMODE_EXCEPTION异常模式报错、ATTR_ORACLE_NULLS NULL_NATURAL、ATTR_STRINGIFY_FETCHES false不把数值列转为字符串。这解释了为什么在 Linux 上使用 Microsoft 的sqlsrvPDO 扩展或 FreeTDSdblib驱动都能被 Illuminate Database 自动适配。事务语义SqlServerConnectionSqlServerConnection.php 对事务做了针对 SQL Server 的定制当 PDO 驱动名为sqlsrv时直接复用父类基于beginTransaction/commit/rollBack的标准事务流程当驱动为dblib时则手工执行BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN并在捕获异常含Throwable后回滚并重新抛出确保任何情况下都不会残留未提交事务。这也意味着同样的DB::transaction(fn () ...)代码在两种驱动下都能获得正确的事务保证。此外该类还通过SqlServerGrammar查询/架构语法与SqlServerProcessor提供 SQL Server 专属的 SQL 方言编译例如分页、标识列处理并接入 Doctrine DBAL 的PDOSqlsrv驱动用于 Schema 内省。在 Laravel 应用中落地Myboard 示例的完整链路本仓库的 laravel 示例Myboard演示了从配置到运行的全流程README.md安装前置Composer、PHP 7、Microsoft PHP SQL Server Driver、Microsoft ODBC SQL Server Driver、Apache以及mcrypt、mbstring扩展安装依赖在项目根目录执行composer install配置数据库按上文sqlsrv配置段修改 config/database.php执行迁移php artisan migrate随后chmod 777 -R storage赋予存储目录写权限启动应用php artisan serve。其中php artisan migrate走的是 Illuminate Database 的 Migrations 子系统Migrator、MigrationCreator、DatabaseMigrationRepository迁移记录写入配置的migrations表本示例中为migrations从而在 SQL Server 上实现可追踪、可回滚的 Schema 演进。应用层的Todo模型通过 app/Todo.php 映射todos表配合控制器完成“创建待办、标记状态”两个核心功能构成了“Schema 构建器建表 → Eloquent 模型读写 → SQL Server 持久化”的完整闭环。注意事项与适用前提本文所述代码基于仓库中 Laravel 5.1 时代的 Illuminate Databasecomposer.json声明laravel/framework: 5.1.*配置键如strict、schema等在后续 Laravel 版本中有所演进升级时需对照新版文档SQL Server 连接的 DSN 形态取决于 PHP 环境实际可用的 PDO 驱动sqlsrv或dblibLinux 场景下请确保正确安装对应驱动扩展在 Laravel 框架外使用 Capsule 时若需要 Eloquent observer 等事件能力务必额外composer require illuminate/events连接配置中的凭据建议通过环境变量注入避免把明文密码写入版本库。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐ShowDoc 中的 Illuminate Database Capsule 实战指南在 Laravel 之外使用 PHP 数据库工具箱ShowDoc 中的 Illuminate Database Capsule 实战指南在 Laravel 之外使用 PHP 数据库工具箱 本篇技术指南围绕 S文档知识库后端前端Laravel 队列组件Illuminate Queue独立使用指南基于 Capsule 的 Beanstalkd 接入与 Worker 消费机制详解Laravel 队列组件Illuminate Queue独立使用指南基于 Capsule 的 Beanstalkd 接入与 Worker 消费机制详解 L示例工程数据库教程后端如何用Vocos-mel-24khz实现高质量音频合成从Mel频谱图到波形的完整教程如何用Vocos mel 24khz实现高质量音频合成从Mel频谱图到波形的完整教程 想要实现高质量的音频合成吗Vocos mel 24khz正是您需要的终创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考