我用nextjs和supabase制作一个食谱网站。我有一个场合表,里面有很多食谱的外键。我可以很容易地查询所有食谱在那个场合的场合,但是我想要分页,所以我需要一个计数和范围。我将如何去做这件事,或者我必须做一个RPC代替?
这是我当前的查询,在一个场合返回所有食谱-查询中的评论是我想在
上放一个计数/范围.from("occasions")
.select(
`*,
recipes_occasions(
recipes(
// I WANT TO GET EXACT COUNT OF ALL RECIPES IN AN OCCASION HERE
recipeId, title, slug, totalTime, yield, ingredients,
recipes_categories (
categories(title, slug)
),
recipes_diets (
diets(title, slug)
),
recipes_cuisines (
cuisines(title, slug, code)
)
),
)`
)
.eq("slug", slug )
.range(0,4)
// I WANT TO TAKE SPECIFIC RANGE HERE (e.g. range(12, 24) or range(200, 212)
有多种方法可以解决这个问题。将其拆分为两个单独的查询当然是一种选择。
另一种选择可能是翻转查询并获得与其相关场合的食谱。
const { data, error } = supabase
.from("recipes")
-- Edit above fixed recipe typo
.select(
`*,
recipes_categories (
categories(title, slug)
),
recipes_diets (
diets(title, slug)
),
recipes_cuisines (
cuisines(title, slug, code)
),
occasions!inner(*)`,
{ count: 'exact' }
)
.eq("occasions.slug", slug )
.range(0,4)
count: 'exact'
将获得食谱的数量,以便您可以使用它来分页。
在occasions
之后使用!inner
关键字,可以根据occasions
的值过滤所选recipes
的结果。——修改上面的配方错字
我设法通过首先从单元格中获取偶次ID,然后另一个查询来获取具有该场合ID的食谱,从而使范围工作。也增加了解构计数。
const { data, error } = await supabase
.from("occasions")
.select(`occasionId`)
.eq("slug", context.query.slug )
const occasionId = await data[0].occasionId;
const { data: recipes, count, recipeError } = await supabase
.from('recipes_occasions')
.select(`*, recipeDetails: recipes(title)`, {count: 'exact'})
.eq('occasion_id', occasionId)
.range(0,1)
结果在我的终端
[
{
id: 134,
created_at: '2022-12-13T18:17:35.433285+00:00',
recipe_id: 'd7c493ff-6aae-4929-bf74-c6d44e2eb8f7',
occasion_id: '1c907e40-4717-4c22-aeb6-c51044fb276a',
recipeDetails: { title: 'Easter egg cheesecake' }
},
{
id: 135,
created_at: '2022-12-13T18:18:39.011853+00:00',
recipe_id: '30254e94-6692-4a57-a173-c5ccee758d59',
occasion_id: '1c907e40-4717-4c22-aeb6-c51044fb276a',
recipeDetails: { title: 'Rhubarb & custard tart' }
}
]
13