如何在查询中包含自定义 SELECT



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

在Postgres中,我会找到所有文章,按created_at字段对它们进行排序,然后SELECTSELECT 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
},
});

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

感谢您的帮助。

你可以按照Ryan在这里的建议去做(第二个建议是你引入一个新字段,也许是excerpt),或者你可以做一个原始查询,如下所示:

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 来确定$queryRaw泛型类型参数TCustomArticle只选择我们需要的相关信息,以便我们可以有一个类型化的返回值。

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

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

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

我们在这里有一个要求,所以如果你能添加一个,以便我们可以查看优先级,那就太好了。

最新更新