我有两个实体,即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中指定的标签数组。我希望包含所有标签
有什么更好的方法吗?
答案 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 ....