我正在使用Nodejs,Express,Postgresql和Sequelize
我有4个模特
帐户(有很多书)
书(有很多部分)
我要归还一本书,并且包括' Part'和'章'有一些特定的顺序 - 这很好。
模型'章'有专栏'主题'而且我只想要包含“'章节”中的行。具有不同主题的模型'。
我如何应用这个'章节'这个嵌套的包含结构的模型?
代码段:
return Book
.findOne({
where: {accountid: req.body.accountid,
id: req.body.bookid},
include: [{
model: Part,
as: 'parts'
include: [
{
model: Chapter,
required: false,
as: 'chapters',
where: {
createdAt: {
$gte: moment().subtract(24,'hours').format()
}
}
}],
}],
order: [
[
{ model: Part, as: 'parts' },
'createdAt',
'DESC'
],
[
{ model: Part, as: 'parts' },
{ model: Chapter, as: 'chapters' },
'createdAt',
'DESC'
]
]
})
.then(book => res.status(200).send(book))
.catch(error => res.status(400).send(error.toString()));
}
答案 0 :(得分:2)
Seludeize不同的功能在包含的情况下不起作用。
您可以使用sequelize原始查询来实现结果。
答案 1 :(得分:0)
我知道这是一个很晚的答案,但实际上您可以在include表列上有区别。唯一的缺点是您必须分析Sequelize生成的查询并包括每个模型的属性。
您的查询最终将如下所示:
Book.findOne({
// Literal DISTINCT ON as 1 so it is not included in the resulting json
// '*' so all table attributes are included in the json response
attributes: [Sequelize.literal('DISTINCT ON("chapters"."topics") 1'), '*']
where: {accountid: req.body.accountid,
id: req.body.bookid},
include: [{
model: Part,
as: 'parts'
include: [
{
model: Chapter,
required: false,
as: 'chapters',
where: {
createdAt: {
$gte: moment().subtract(24,'hours').format()
}
}
}],
}],
order: [
// This order criteria is required because we are using distinct on
[
{ model: Chapter, as: 'chapters' },
'topics',
'ASC'
],
[
{ model: Part, as: 'parts' },
'createdAt',
'DESC'
],
[
{ model: Part, as: 'parts' },
{ model: Chapter, as: 'chapters' },
'createdAt',
'DESC'
]
]
})
可以使用相同的策略来“区分”多个列,但是您必须记住将这些列作为第一个搜索条件。
在Sequelize的Github上搜索“ DISTINCT ON”会导致一些有趣的帖子。
希望有帮助。智利的最诚挚问候。