Sequelize Associations导致子查询

时间:2017-02-24 12:53:29

标签: sequelize.js

我的应用程序中有一个功能,它充当带有博客帖子的活动源(类似于Tumblr)。在此页面的路径中,我的主查询位于我的博客帖子表中,我正在将包含其他元信息和注释的表连接到此表,以获取每个博客帖子的全功能卡片。这些表来自我的类​​别(对帖子进行分类),主题(感兴趣的主题),附加的文件(文件/图像)和评论(评论帖子)表。

使用我当前的查询,我可以毫无问题地加入所有这些表,但是我遇到了与博客文章中与父查询相关联的where子句的问题。当filecomment表加入时,会出现一个子查询,我认为这与博客帖子和那些表之间的关联类型有关,并以某种方式影响结果。

提供了架构和关联:

blog_post

  • blog_id
  • 日期
  • 含量
  • CATEGORY_ID
  • topic_id

协会

  • belongsTo(user,{foreignKey:' user_id'});
  • belongsTo(category,{foreignKey:' category_id'});
  • belongsTo(topic,{foreignKey:' topic_id'});
  • hasMany(file,{foreignKey:' blog_id'});
  • hasMany(评论,{foreignKey:' blog_id'});

用户

  • USER_ID
  • 如first_name
  • 姓氏
  • 的organization_ID

类别

  • CATEGORY_ID
  • 类别

协会

  • hasMany(blog_post,{foreignKey:' category_id'})

主题

  • topic_id
  • 主题

协会

  • hasMany(blog_post,{foreignKey:' topic_id'})

文件和注释表在与此问题相关的架构文件中没有关联。

提供的是查询(请不要骆驼套管上面是别名列名称)

models.BlogPost.findAll({
            order: 'Date DESC',
            include: [{
                model: models.User,
                where: { organizationId: req.user.organizationId },
                attributes: ['userId', 'firstName', 'lastName'],
                required: false,
            },
            {
                model: models.Topic,
                attributes: ['topic'],
                required: false
            },
            {
                model: models.Category,
                attributes: ['category'],
                required: false
            },
            {
                model: models.File,
                attributes: ['file'],
                required: false
            },
            {
                model: models.Comment,
                include: [{
                    model: models.User,
                    attributes: ['userId','firstName', 'lastName']
                }],
                required: false
            }],
            limit: 10
        })

使用子查询更新:

SELECT `blog_post`.*, `user`.`user_id`, `user`.`first_name`, `user`.`last_name`, `topic`.`topic_id`, `topic`.`topic`, `category`.`category_id`, `category`.`category_name`, `file`.`file_id`, `file`.`file`, `comment`.`comment_id`, `comment`.`comment`, `comment`.`blog_id`, `comment`.`user_id`, `comment`.`created_at`, `comment`.`updated_at`, `comment`.`blog_id`, `comment`.`user_id`, `comment.user`.`user_id`
FROM (SELECT `blog_post.`blog_id`, `blog_post.`date`, `blog_post.`title`, `blog_post.`content`, `blog_post.`topic_id`, `blog_post.`category_id`, `blog_post.`user_id`, `blog_post.`created_at`, `blog_post.`updated_at`, `blog_post.`user_id`, `blog_post.`topic_id`, `blog_post.`category_id` FROM `blog_post LIMIT 10) AS `blog_post 
LEFT OUTER JOIN `user` AS `user` ON `blog_post.`user_id` = `user`.`user_id` AND `user`.`organization_id` = 1 
LEFT OUTER JOIN `topic` AS `topic` ON `blog_post.`topic_id` = `topic`.`topic_id` 
LEFT OUTER JOIN `category` AS `category` ON `blog_post.`category_id` = `category`.`category_id` 
LEFT OUTER JOIN `file` AS `file` ON `blog_post.`blog_id` = `file`.`blog_id` 
LEFT OUTER JOIN `comment` AS `comment` ON `blog_post.`blog_id` = `comment`.`blog_id` 
LEFT OUTER JOIN `user` AS `comment.user` ON `comment`.`user_id` = `comment.user`.`user_id` 
ORDER BY date DESC;

2 个答案:

答案 0 :(得分:5)

您可能需要在subQuery: false方法的options对象中添加findAll。但是,sequelize文档中没有此选项,您可以在source code中找到它。如果未设置,则默认为true,并在查询中出现LIMIT选项时添加您提到的子查询。

答案 1 :(得分:0)

我遇到了同样的问题。我将 subQuery:false 与where语句对象一起使用。

like:-

{
include:[{model:childrens,attributes:['id','firstName']}],
where:{'$childrens.id$':12}
subQuery:false
}

,但是请记住,如果要在where语句中使用内部表 那么您将必须使用:-

where:{'$childrens.id$':12}

因为如果您不使用'$',它将自动创建:

abcd(main table).childrens.id=12

因此要检查子代ID的ID值,您将 必须使用'$'

就是这样。希望它对您有用。