对于我目前正在制作的博客网站,我需要从数据库中检索最近的文章以在博客的主页上显示它们。我不想检索最后 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
},
});
但它告诉我它期待一个布尔值而不是字符串。
感谢您的帮助。
你可以按照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
泛型类型参数T
,CustomArticle
只选择我们需要的相关信息,以便我们可以有一个类型化的返回值。
Prisma目前无法直接做到这一点,因此有两种解决方法:
-
获取内容,然后在前端显示前 15 个字符。
-
创建另一个仅包含
content
前 15 个字符的字段,然后选择该字段。
我们在这里有一个要求,所以如果你能添加一个,以便我们可以查看优先级,那就太好了。