续集-包括所有符合条件的孩子

时间:2019-03-20 20:52:27

标签: mysql sql sequelize.js

我有两个实体,即Post和Tag,我试图查询所有具有传递给where子句的任何标签的帖子。另外,我想包括所有用于最终发布帖子的标签。

关联定义为

Post.belongsToMany(
      models.tag,
      {
        through: 'post_tag'
      }
    );

我的查询就是这样

models.post.findAll({
    limit: 20,
    offset: 0,
    attributes: [
        'id',
        'name'
    ],
    include: [{
        model: models.tag,
        attributes: ['name'],
        where: {
            name: {
                [Op.in]: ['tagNameHere']
            }
        }
    }],
    where: [{
      active: {
        [Op.not]: 'False'
      }
    }],
    order: [ ['name', 'ASC'] ]
})

它确实有效,但是包含的标签数组仅是在Op.in中指定的标签数组。我希望包含所有标签

有什么更好的方法吗?

1 个答案:

答案 0 :(得分:0)

一种方法是进行两次通过:1)查找具有特定标签的帖子,2)查找这些帖子的所有标签。您需要第三种关联才能实现此目的:

models.post.belongsToMany(models.tag, {through: models.postTag, foreignKey: 'post_id'} );
models.tag.belongsToMany (models.post,{through: models.postTag, foreignKey: 'tag_id' });

models.post.hasOne(Post, {
   foreignKey: {name: 'id'},
   as: 'selfJoin'
});

现在,确定具有特定标签(或多个标签)的帖子

models.post.addScope('hasParticularTag',
{
   attributes: ['id'],
   include: [
     {
       model: models.tag, 
       through: models.postTag,
       attributes: [],
       where: {name: 'TAG-YOU-WANT'}   // your parameter here...
     }]    
 });

最后,列出选定的帖子及其所有任务...

models.post.findAll({    
   attributes: ['id','name'],
   include: [
      { // ALL tags
        model: models.tag, 
        through: models.postTag,
        attributes: ['name']
      },
      { // SELECTED posts
        model: models.post.scope('hasParticularTag'),
        required: true,
        as: 'selfJoin',   // prevents error "post isn't related to post"
        attributes: []
      }]
 })

HTH ....