Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否可以在Sequelize中对多态多对多模型进行紧急加载?_Node.js_Sqlite_Orm_Sequelize.js_Eager Loading - Fatal编程技术网

Node.js 是否可以在Sequelize中对多态多对多模型进行紧急加载?

Node.js 是否可以在Sequelize中对多态多对多模型进行紧急加载?,node.js,sqlite,orm,sequelize.js,eager-loading,Node.js,Sqlite,Orm,Sequelize.js,Eager Loading,我有这个结构的目的是在Sequelize的多态多对多关联上实现急切加载 当给出选项include时,它会返回意外的结果(例如不属于此标签的食谱和帖子) 模型 //食品模型 食物。属于胃(models.Tag{ 通过:{ 型号:“tag_taggable”, 独特的:错误, 范围:{taggable_类型:“食品”} }, 外键:“taggable_id”, 约束条件:false }); //配方模型 配方。属于配方(models.Tag{ 通过:{ 型号:“tag_taggable”, 独特的

我有这个结构的目的是在Sequelize的多态多对多关联上实现急切加载

当给出选项include时,它会返回意外的结果(例如不属于此标签的食谱和帖子

模型
//食品模型
食物。属于胃(models.Tag{
通过:{
型号:“tag_taggable”,
独特的:错误,
范围:{taggable_类型:“食品”}
},
外键:“taggable_id”,
约束条件:false
});
//配方模型
配方。属于配方(models.Tag{
通过:{
型号:“tag_taggable”,
独特的:错误,
作用域:{taggable_type:“配方”}
},
外键:“taggable_id”,
约束条件:false
});
//Post模型
Post.belongtomany(models.Tag、{
通过:{
型号:“tag_taggable”,
独特的:错误,
作用域:{taggable_type:“post”}
},
外键:“taggable_id”,
约束条件:false
});
//标记模型
标签。属于胃(模型、食物、{
通过:{
型号:“tag_taggable”,
唯一:错误
//范围:{taggable_类型:“食品”}
},
外键:“tag_id”,
约束条件:false
});
标签。属于名称(型号、配方、{
通过:{
型号:“tag_taggable”,
唯一:错误
//作用域:{taggable_type:“配方”}
},
外键:“tag_id”,
约束条件:false
});
Tag.belongtomany(models.Post、{
通过:{
型号:“tag_taggable”,
唯一:错误
//作用域:{taggable_type:“post”}
},
外键:“tag_id”,
约束条件:false
});
Tag.prototype.gettagables=异步函数(选项){
const recipes=wait this.getRecipe(选项);
const foods=wait this.getFood(选项);
const posts=wait this.getPost(选项);
返回岗位。海螺(食谱)。海螺(食品);
}
//Tag\u Taggable连接模型
const taggable=sequelize.define(
“可标记的”,
{
id:{type:DataTypes.BIGINT,primaryKey:true,autoIncrement:true},
tag_id:{type:DataTypes.BIGINT,unique:“tt_unique_constraint”},
taggable_id:{type:DataTypes.BIGINT,unique:“tt_unique_constraint”,引用:null},
taggable_类型:{type:DataTypes.STRING,unique:“tt_unique_constraint”},
}
);
数据库 标记可标记记录:

询问 查询#1:查找所有标签,包括与急切加载相关的标签(食品、帖子、食谱)

SELECT 
    `Food`.`id`, 
    `Food`.`name`, 
    `tags`.`id` AS `tags.id`, 
    `tags`.`name` AS `tags.name`, 
    `tags->tag_taggable`.`taggable_id` AS `tags.tag_taggable.taggable_id`, 
    `tags->tag_taggable`.`tag_id` AS `tags.tag_taggable.tag_id` 
    
FROM 
    `food` AS `Food` 
    
LEFT OUTER JOIN `tag_taggable` AS `tags->tag_taggable` 
ON `Food`.`id` = `tags->tag_taggable`.`taggable_id` 

LEFT OUTER JOIN `tag` AS `tags` 
ON `tags`.`id` = `tags->tag_taggable`.`tag_id` 
AND `tags->tag_taggable`.`taggable_type` = 'food' WHERE `Food`.`id` = 2;
const tags=wait Tag.findAll({
包括:[
{model:db[“Food”]/*,必需:true*/},
{model:db[“Post”]/*,必需:true*/},
{model:db[“Recipe”]/*,必需:true*/},
]
});
返回标记[0];//找到的第一个标签
预计:只有食品(“汉堡包”、“培根”)配方(“凯撒沙拉配方”)会出现

{ id:1 , name:"fast", foods: [ {hamburger}, {bacon} ], recipes: [ {caesar salad recipe} ], posts: [] }
输出

[
0: { 
id:1,
名称:“快”,
食物:[
{
名称:“汉堡包”,
标记id:1,
标签号:1
}, 
{
名字:“培根”,
标签编号:2,
标签号:1
} 
],
食谱:[
{
名称:“凯撒沙拉配方”,
标记id:1,
标签号:1
}, 
{
名称:“法式沙拉配方”,
标签编号:2,
标签号:1
} 
],
职位:[
{
姓名:“职位1”,
标记id:1,
标签号:1
}, 
{
姓名:"邮政2",
标签编号:2,
标签号:1
} 
]
}
]
意外的#1 它显示了两篇文章和一个食谱,而不应该出现在标签fast

当包含相关模型时,范围似乎不会影响内部联接(taggable_类型看起来像被忽略)

如果我在tags0上调用gettagables,我将获得数组中的预期项(但是这不是急于加载)

查询#2(反向):查找与“bacon”关联的所有标记

const food=wait food.findOne({
其中:{id:2},
包括:[
{ 
型号:db[“Tag”]//必需:true
}
]
});
期望

输出

{
id:2,
名字:“培根”,
标签:[
{
名称:“快”,
tag_taggable:{
标签编号:2,
标签号:1
}
}, 
{
名称:空
tag_taggable:{
标签编号:2,
标签编号:2
}
} 
]
意外的#2 它在标签include中包含了错误的模型(它在标签中包含了一个配方),显示为null(不知何故它是一个配方)

SQL 查询#1生成的一个错误sql查询:Tag.include(Food、Recipe、Post)

查询#2生成的第二个错误sql查询:Food.include(Tag)

包裹

"sequelize": "^6.3.4",
"sequelize-cli": "^6.2.0",
"sqlite3": "^5.0.0",
我如何处理这个模型,包括紧急加载情况

{ id:2, name:"bacon", tags:[ {fast} ] }
SELECT 
    `Tag`.`id`, 
    `Tag`.`name`, 
    `Tag`.`color`, 
    `Tag`.`created_at` AS `createdAt`, 
    `Tag`.`updated_at` AS `updatedAt`, 
    `foods`.`id` AS `foods.id`, 
    `foods`.`name` AS `foods.name`, 
    `foods->tag_taggable`.`taggable_id` AS `foods.tag_taggable.taggable_id`, 
    `foods->tag_taggable`.`tag_id` AS `foods.tag_taggable.tag_id`, 
    `recipes`.`name` AS `recipes.name`, 
    `recipes->tag_taggable`.`taggable_id` AS `recipes.tag_taggable.taggable_id`,
    `recipes->tag_taggable`.`tag_id` AS `recipes.tag_taggable.tag_id` 

FROM
    `tag` AS `Tag` 
    
LEFT OUTER JOIN `tag_taggable` AS `foods->tag_taggable` 
ON `Tag`.`id` = `foods->tag_taggable`.`tag_id` 

LEFT OUTER JOIN `food` AS `foods` 
ON `foods`.`id` = `foods->tag_taggable`.`taggable_id` 

LEFT OUTER JOIN `tag_taggable` AS `recipes->tag_taggable` 
ON `Tag`.`id` = `recipes->tag_taggable`.`tag_id` 

LEFT OUTER JOIN `recipe` AS `recipes` 
ON `recipes`.`id` = `recipes->tag_taggable`.`taggable_id`;

LEFT OUTER JOIN `tag_taggable` AS `post->tag_taggable` 
ON `Tag`.`id` = `posts->tag_taggable`.`tag_id` 

LEFT OUTER JOIN `post` AS `posts` 
ON `posts`.`id` = `posts->tag_taggable`.`taggable_id`;
SELECT 
    `Food`.`id`, 
    `Food`.`name`, 
    `tags`.`id` AS `tags.id`, 
    `tags`.`name` AS `tags.name`, 
    `tags->tag_taggable`.`taggable_id` AS `tags.tag_taggable.taggable_id`, 
    `tags->tag_taggable`.`tag_id` AS `tags.tag_taggable.tag_id` 
    
FROM 
    `food` AS `Food` 
    
LEFT OUTER JOIN `tag_taggable` AS `tags->tag_taggable` 
ON `Food`.`id` = `tags->tag_taggable`.`taggable_id` 

LEFT OUTER JOIN `tag` AS `tags` 
ON `tags`.`id` = `tags->tag_taggable`.`tag_id` 
AND `tags->tag_taggable`.`taggable_type` = 'food' WHERE `Food`.`id` = 2;
"sequelize": "^6.3.4",
"sequelize-cli": "^6.2.0",
"sqlite3": "^5.0.0",