动态查询构建
默认情况下,Drizzle 中的所有查询构建器尽量遵循 SQL,因此大多数方法只能调用一次。
例如,在 SELECT
语句中,可能只有一个 WHERE
子句,因此你只能调用一次 .where()
:
在以前的 ORM 版本中,由于没有实现这些限制,特别是这个例子对许多用户来说是个困惑,因为他们期望查询构建器能够“合并”多个 .where()
调用成为一个条件。
这种行为对于传统查询构建很有用,即在一次性创建整个查询时。
然而,当你想动态构建查询时,比如拥有一个接收查询构建器并进行增强的共享函数时,这就成了一个问题。
为了解决这个问题,Drizzle 提供了一个特殊的“动态”模式,用于查询构建器,这消除了只能调用方法一次的限制。
要启用它,你需要在查询构建器上调用 .$dynamic()
。
让我们通过实现一个简单的 withPagination
函数来看看它是如何工作的,该函数根据提供的页码和可选的页面大小,为查询添加 LIMIT
和 OFFSET
子句:
请注意,withPagination
函数是泛型的,这使你能够在其中修改查询构建器的结果类型,例如通过添加连接:
这可能是因为 PgSelect
和其他类似类型专门设计用于动态查询构建。它们只能在动态模式下使用。
以下是可以作为泛型参数用于动态查询构建的所有类型列表:
方言 | 类型 |
查询 | 选择 | 插入 | 更新 | 删除 |
Postgres | PgSelect | PgInsert | PgUpdate | PgDelete |
PgSelectQueryBuilder |
MySQL | MySqlSelect | MySqlInsert | MySqlUpdate | MySqlDelete |
MySqlSelectQueryBuilder |
SQLite | SQLiteSelect | SQLiteInsert | SQLiteUpdate | SQLiteDelete |
SQLiteSelectQueryBuilder |
...QueryBuilder
类型用于与 独立查询构建器实例 一起使用。
数据库查询构建器是它们的子类,
因此你也可以使用它们。