You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:52:39