In my application, I am using sequelize ORM. There are several entities: A Tool
can have Tags
and Categories
.
Now I want to search for all Tool
s, that have a specific Tag
, but I want to include all relating Tag
s of that tool (not just the specific one). If I now place a where
statement into the include, only specified Tag
s are included into the result set (see [2]
). I tried to limit the Tag
s in the outer where statement (see [1]
), but this does not help either.
Example
Tool A
has Tags t1
, t2
and t3
. Now I want to search all Tools that have the Tag t3
, but the result set shall contain all three tags.
Expected result:
Tool A
\
- Tag t1
- Tag t2
- Tag t3
db.Tool.scope('published').findAll({
where: { '$tool.tag.name$': filter.tag }, // [1] Does not work
include: [
{
model: db.User,
attributes: ['id', 'username']
},
{
model: db.Tag,
attributes: ['name'],
through: { attributes: [] },
// [2] Would limit the result specified tag
// where: {
// name: {
// [Op.and]: filter.tag
// }
// }
},
{
model: db.Category,
attributes: ['id', 'name', 'views'],
through: { attributes: ['relevance'] },
where: {
id: {
[Op.and]: filter.category
}
}
}
],
where: {
title: {
[Op.like]: `%${filter.term}%`,
}
},
attributes: ['id', 'title', 'description', 'slug', 'docLink', 'vendor', 'vendorLink', 'views', 'status', 'createdAt'],
order: [['title', 'ASC'], [db.Tag, 'name', 'ASC']]
})
I know I could perform this by performing a select via the Tag in the first place (db.Tag.findAll()
instead of db.Tool.findAll()
; I've already done this elsewhere in my project), but at the same time I also want to be able to filter by another entity (Category
) the same way. So the Tool.findAll()
should be the starting point.
Any help appreciated!