【问题标题】:How can I include custom SELECTs in my queries如何在我的查询中包含自定义 SELECT
【发布时间】:2021-09-28 01:43:19
【问题描述】:

对于我目前正在制作的博客网站,我需要从数据库中检索最近的文章以将它们显示在博客的主页上。我不想检索所有最后 10 篇文章的内容,而是检索它们的开头。

在 Postgres 中,我会找到所有文章,按 created_at 字段对它们进行排序,然后将 SELECT 内容与 SELECT left(content, 15) 进行排序,以获取我文章内容的前 15 个字符。

如何使用 Prisma 实现这一目标?

我试过了

  return prisma.article.findMany({
    orderBy: {
      createdAt: 'desc',
    },
    select: {
      createdAt: true,
      id: true,
      title: true,
      updatedAt: true,
      content: 'left(content, 15)' as any
    },
  });

但它告诉我它需要一个布尔值而不是字符串。

感谢您的帮助。

【问题讨论】:

    标签: javascript prisma


    【解决方案1】:

    您可以按照 Ryan 的建议 here 进行操作(第二个建议是您引入一个新字段,可能类似于 excerpt)或者您可以像这样执行 raw query

    import { Article } from '@prisma/client';
    
    type CustomArticle = Pick<Article, 'id' | 'title' | 'content' | 'createdAt' | 'updatedAt'>;
    
    const prisma = /* your prisma client */
    const result = await prisma.$queryRaw<CustomArticle[]>`SELECT id, title, LEFT(content, 15) as content, createdAt, updatedAt FROM Article;`
    
    

    您可以这样做,但我建议您改为引入一个新字段,因为LEFT(content, 15) 仍会获取整个内容,但会删除第 15 个字符之后的所有内容。

    在这个例子中,我使用 TypeScript 来确定 $queryRaws 泛型类型参数 TCustomArticle,它只选择我们需要的相关信息,以便我们可以有一个类型化的返回值。

    【讨论】:

      【解决方案2】:

      目前 Prisma 无法直接实现这一点,因此有两种解决方法:

      1. 获取内容,然后只在前端显示前 15 个字符。

      2. 创建另一个仅包含 content 前 15 个字符的字段并选择该字段。

      我们对此here 有一个请求,所以如果您可以在其中添加一个 ? 将是非常棒的,以便我们可以查看优先级。

      【讨论】:

      • 感谢您的回答!我暂时保持开放状态,等待可行的解决方案
      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2015-10-04
      • 2014-11-13
      • 2021-12-27
      • 2021-09-14
      • 2017-06-03
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多