Javascript Sequelize-通过另一个表包含表

Javascript Sequelize-通过另一个表包含表,javascript,sequelize.js,associations,Javascript,Sequelize.js,Associations,给定表Project、ProjectVersion、ProjectVersionOverview和以下关联 Project.hasMany(ProjectVersion); ProjectVersion.belongsTo(Project); ProjectVersion.hasMany(ProjectVersionOverview); ProjectVersionOverview.belongsTo(ProjectVersion); 所以基本上Project->有很多ProjectVers

给定表Project、ProjectVersion、ProjectVersionOverview和以下关联

Project.hasMany(ProjectVersion);
ProjectVersion.belongsTo(Project);

ProjectVersion.hasMany(ProjectVersionOverview);
ProjectVersionOverview.belongsTo(ProjectVersion);
所以基本上Project->有很多ProjectVersion->有很多ProjectVersionOverview

ProjectVersion的字段“version”是一个递增的整数, ProjectVersionOverview有一个字符串字段“text”

鉴于项目,我想返回以下内容:

result: {
   "projectId": 1,
   "projectVersionOverviews": [
        { "text": ... },
        { "text": ... },
   ]
}
我要说的是ProjectVersionOverview将根据ProjectVersion中的最新版本记录获取,它更像是一个隐含对象,不包含在输出中

我正在寻找的问题是这样的

Project.findOne({
    where: { id: projectId },
    include: {
        model: ProjectVersionOverview,
        through: {
            model: ProjectVersion,
            order: [[ "version", "DESC" ]],
            limit: 1
        }
    }
})

我理解这不是“through”的正确用法,但是作为一个示例,我认为它是有意义的。

您应该使用嵌套的
include
选项,下面是一个工作示例:

index.ts

从'../../db'导入{sequelize};
从“sequelize”导入{Model,DataTypes};
类项目扩展模型{}
init({},{sequelize,modelName:'projects'});
类ProjectVersion扩展模型{}
ProjectVersion.init(
{
版本:{
primaryKey:没错,
自动递增:真,
类型:DataTypes.INTEGER,
allowNull:错,
},
},
{sequelize,modelName:'project_versions'},
);
类ProjectVersionOverview扩展模型{}
init({text:DataTypes.STRING},{sequelize,modelName:'project\u version\u overview'});
Project.hasMany(ProjectVersion);
ProjectVersion.belongsTo(项目);
ProjectVersion.hasMany(ProjectVersionOverview);
ProjectVersionOverview.belongsTo(ProjectVersion);
(异步函数测试(){
试一试{
//创建表
wait sequelize.sync({force:true});
//种子
等待Project.create(
{
项目(u)版本:[
{
项目版本概述:[{text:'a'},{text:'b'}],
},
{
项目版本概述:[{text:'x'},{text:'y'},{text:'z'}],
},
],
},
{include:[{model:ProjectVersion,include:[ProjectVersionOverview]}]},
);
//试验
const result=wait Project.findOne({
其中:{id:1},
包括:[
{
型号:ProjectVersion,
属性:['version'],
包括:[
{
型号:ProjectVersionOverview,
属性:['text'],
},
],
},
],
raw:是的,
});
控制台日志(结果);
}捕获(错误){
console.log(错误);
}最后{
等待续集。关闭();
}
})();
执行结果:

执行(默认):如果存在“项目版本概述”级联,则删除表;
执行(默认):如果存在“项目版本”级联,则删除表;
执行(默认):如果存在“项目”级联,则删除表;
执行(默认):如果存在“项目”级联,则删除表;
执行(默认):如果不存在“项目”(“id”序列,则创建表,主键(“id”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='projects'按i.relname分组,ix.indexrelid,ix.indprimary,ix.indisunique,ix.indkey按i.relname排序;
执行(默认):如果存在“项目版本”级联,则删除表;
执行(默认):如果不存在表,则创建表“project_versions”(“version”SERIAL,“projectd”INTEGER REFERENCES“projects”(“id”)ON DELETE在更新级联时设置NULL,主键(“version”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='project_versions'按i.relname分组,ix.indexrelid,ix.indisprimary,ix.indisunique,ix.indkey按i.relname排序;
执行(默认):如果存在“项目\版本\概述”级联,则删除表;
执行(默认):创建表,如果不存在“项目版本概述”(“id”序列,“text”VARCHAR(255),“projectVersionVersion”整数引用“项目版本”(“版本”),则在删除时在更新级联时设置NULL,主键(“id”);
执行(默认):选择i.relname作为名称,ix.indprimary作为主要,ix.indunique作为唯一,ix.indkey作为indkey,array_agg(a.attnum)作为列索引,array_agg(a.attname)作为列名称,pg_get_indexdef(ix.indexrelid)作为pg_class t,pg_class i,pg_index ix的定义,pg_属性a,其中t.oid=ix.indrelid和i.oid=ix.indexrelid和a.attrelid=t.oid和t.relkind='r'和t.relname='project_version_overview'按i.relname分组,ix.indexrelid,ix.indprimary,ix.indisunique,ix.indkey按i.relname排序;
执行(默认):在“项目”(“id”)中插入返回*的值(默认值);
正在执行(默认):在“project_versions”(“version”,“projectd”)中插入值(默认值,$1),返回*;
正在执行(默认):在“project_versions”(“version”,“projectd”)中插入值(默认值,$1),返回*;
执行(默认):插入“项目版本概述”(“id”、“文本”、“项目版本”)值(默认值,$1,$2)返回*;
执行(默认):插入“项目版本概述”(“id”、“文本”、“项目版本”)值(默认值,$1,$2)返回*;
执行(默认):插入“项目版本概述”(“id”、“文本”、“项目版本”)值(默认值,$1,$2)返回*;
正在执行(默认):插入“项目版本”