基于JOIN结果序列化过滤器



我有一个表orders,它与categories有一个从属关系。即一个订单可以同时包含foodfruitbanana三个类别。

Order.belongsToMany(models.category, { through: 'orderCategory', as: 'categories' });

我想做一个查询来获取至少有一个给定类别的所有订单。例如,给我所有具有food类别的订单。如果我很高兴获得JOIN中只包含食品类别的订单,那么这将很简单。但我想包括所有类别,即使只有一个匹配。因此,实际上我需要根据左外连接结果对值进行筛选。

我现在的查询:

order.findAll({
include: [
{
model: models.category,
as: 'categories',
where: {
id: 'a437ffab-5085-4fd7-b193-23dfb299aa39',
},
// required: false,
},
],
})

我也试过把where语句放在父节点上。

{ '$categories.id$': 'a437ffab-5085-4fd7-b193-23dfb299aa39' }但我想本质上是一样的。

一个想法是在获取之后做过滤,但这样我就不能做适当的限制和偏移。

编辑:根据一个评论的建议,我为此编写了原始SQL,这可能会使随后尝试将其转换为Sequelize更容易。

SELECT
*
FROM
orders
JOIN order_categories ON order_categories.order_id = orders.id
WHERE
orders.id in(
SELECT
order_id FROM order_categories
WHERE
order_categories.category_id = 'a437ffab-5085-4fd7-b193-23dfb299aa39')

我不确定这是否是最有效的方法,但它有效。现在的问题是如何在Sequelize中做到这一点。

let we have an order_id with name of order_id. then we can retrive data using this code 
order.findAll({
where:{id:order_id},
include: [
{
model: models.category,
as: 'categories',
where: {
id: 'a437ffab-5085-4fd7-b193-23dfb299aa39',
},
// required: false,
},
],
})

最新更新