Drizzle ORM:为findMany添加where子句遇类型错误求助
Drizzle ORM findMany 模糊查询(LIKE)实现方案
我尝试给Drizzle ORM的findMany查询添加where子句,实现name字段的模糊查询(类似SQL的LIKE),但没找到对应语法文档。编写的代码如下:
const data = await db.query.GamesTable.findMany({ with: { platforms: { columns: {}, with: { platform: true, }, }, }, where: { name: { contains: query.searchText, }, }, offset: page * 20, limit: 20, })
运行后出现类型错误:
Type { name: { contains: string; }; } is not assignable to type
SQL | ((fields: { id: PgColumn<{ name: "id"; tableName: "games"; dataType: "string"; columnType: "PgUUID"; data: string; driverParam: string; notNull: true; hasDefault: true; enumValues: undefined; baseColumn: never; }, {}, {}>;
Drizzle ORM不支持直接用contains这种对象语法做模糊查询,得用它提供的专用函数或者SQL模板来实现,下面是几种可行的写法:
方法1:用like操作符(手动加通配符)
导入like函数,在查询文本前后拼接%来实现模糊匹配:
import { like } from 'drizzle-orm'; const data = await db.query.GamesTable.findMany({ with: { platforms: { columns: {}, with: { platform: true, }, }, }, where: like(GamesTable.name, `%${query.searchText}%`), offset: page * 20, limit: 20, });
方法2:用ilike实现大小写不敏感查询
如果需要忽略大小写的模糊匹配,换成ilike函数即可:
import { ilike } from 'drizzle-orm'; const data = await db.query.GamesTable.findMany({ with: { platforms: { columns: {}, with: { platform: true, }, }, }, where: ilike(GamesTable.name, `%${query.searchText}%`), offset: page * 20, limit: 20, });
方法3:直接写SQL模板字符串
也可以用sql模板字符串来拼接原生SQL逻辑:
import { sql } from 'drizzle-orm'; const data = await db.query.GamesTable.findMany({ with: { platforms: { columns: {}, with: { platform: true, }, }, }, where: sql`${GamesTable.name} LIKE ${`%${query.searchText}%`}`, offset: page * 20, limit: 20, });
之所以之前的写法报错,是因为Drizzle的对象式where子句只支持严格匹配(比如name: query.searchText)或者数值类的操作符(如gt、lt),模糊查询这类需要通配符的场景,必须用上述方式实现。
内容的提问来源于stack exchange,提问作者BamBam22
相关产品推荐
相关产品推荐

