RSS DEV 社区

Eloquent 的魔法已逝。Drizzle 要求你显式命名列类型。

Follow
PHP 开发者常期望 TypeScript 是 PHP 的强类型版本,但这一类比在考察 Eloquent 和 Drizzle 等数据库交互方式时便显得乏力。Eloquent 采用约定优先(convention-first)的设计,依赖运行时行为而非显式的模式定义。开发者虽能在 PHP 中看到 IDE 自动补全功能,但这通常依赖于手动维护的注解块。这些注解并非 PHP 语言固有的一部分,需要借助外部工具进行生成与维护。 Eloquent 的动态特性使得静态分析器难以在不进行大量配置的情况下准确推断类型。模型中的属性通过魔术方法(magic methods)访问,若未显式文档化,静态分析将无法感知这些属性。这种约定优先的方法论优先考虑快速开发,信任运行时来解析关系和数据。数据库模式并非单一事实来源(single source of truth),迁移脚本和数据库本身才承担这一角色。 相比之下,Drizzle 拥抱模式优先(schema-first)的方法,TypeScript 中的模式声明是唯一的权威来源。该单一事实来源同时生成运行时的 SQL DDL 和 TypeScript 类型。推断出的行类型直接源自模式,无需单独的注解块。查询结果也具有精确推断的类型,反映所选字段和查询约束。 这种模式优先的方法论简化了开发的多个方面。迁移脚本直接从模式文件生成,避免了为数据库结构使用独立语言。验证规则也源自模式,确保数据库、应用逻辑和用户输入之间的类型一致性。重构变得更加安全,因为重命名列会导致整个项目在编译时报错。 然而,模式优先的开发并非没有权衡。与 Eloquent 相比,原型开发的速率可能较慢,因为需要更明确的设置。质量赋值(mass assignment)是 Laravel 等 PHP 框架中的便捷功能,但在模式优先的 TypeScript ORM 中实现不够直接。此外,Drizzle 对多态关系(polymorphic relations)等复杂特性的原生支持不如 Eloquent 完善。
favicon
dev.to
Eloquent's Magic Is Gone. Drizzle Makes You Name Column Types.
文章配图: Eloquent 的魔法已逝。Drizzle 要求你显式命名列类型。
Create attached notes ...