将查询生成器结果映射到 Drizzle 中的嵌套对象

问题描述 投票:0回答:1

我正在从 NestJS-TypeORM 背景过渡到 Drizzle ORM :

  • TypeORM:存储库和查询生成器都返回类似的结构化结果,从而可以轻松处理连接的数据。
  • Drizzle:
    db.query()
    返回结构良好的嵌套数据(例如,用户及其帖子分组在一起)。查询生成器 (
    db.select()
    ) 返回原始、扁平化的数据,需要额外处理才能实现类似的结构。

示例: db.查询结果:

[{
    "id": 10,
    "name": "Dan",
    "posts": [
        {
            "id": 1,
            "content": "SQL is awesome",
            "authorId": 10
        },
        {
            "id": 2,
            "content": "But check relational queries",
            "authorId": 10
        }
    ]
}]

查询生成器结果:

const result: {
    user: { id: number; name: string };
    pets: { id: number; name: string; ownerId: number } | null;
}[] = await db
    .select()
    .from(users)
    .leftJoin(pets, eq(users.id, pets.ownerId));

我正在寻找一种机制或最佳实践,将查询生成器结果映射为嵌套格式(类似于 db.query),以便我的 API 响应保持一致,并且客户端不需要检查不同的格式。

您对此有何建议、模式或库?您如何在基于 Drizzle 的项目中处理这个问题?

提前致谢!

typescript postgresql drizzle drizzle-orm
1个回答
0
投票

在 Drizzle 中,

db.query
用作全阶段 ORM,而
db.select
提供轻量级查询构建器。虽然你可能会遇到一些问题,但它的运行速度要快得多。

这是您的查询的更正版本:

import { eq, getTableColumns } from 'drizzle-orm';
await db
  .select({
    ...getTableColumns(users),
    pets: sql<{ id: number; name: string; ownerId: number }[]>`
      COALESCE(
        json_agg(
          json_build_object(
            'id', ${pets}.id,
            'name', ${pets}.name,
            'ownerId', ${pets}.ownerId
          )
        ) 
        filter (WHERE ${pets}.id IS NOT NULL), '[]'
    ` 
  })
  .from(users)
  .leftJoin(pets, eq(users.id, pets.ownerId));

注意

db.select
不支持多层嵌套;它只允许嵌套一层。

© www.soinside.com 2019 - 2024. All rights reserved.