mysql - 使用 sequelize,在 where 子句中使用连接表的列值的正确方法是什么?
问题描述
我在 MySQL 数据库上使用 sequelize。我在一张桌子上获取所有记录,同时将它与另一张桌子连接起来。WHERE
如果未满足联接表上的条件,我将尝试不包括结果。在WHERE
子句中,我试图将主表中的值与连接表进行比较,但它不起作用:
const expiredMemberships = await Membership.findAll({
include: [
{
model: User,
attributes: ['id'],
include: [
{
model: Post,
required: true,
attributes: ['id', 'created'],
where: {
created: {
[Op.gt]: '$Membership.created$',
},
},
},
],
},
],
attributes: ['id', 'created'],
where: {
isActive: true,
},
});
它创建以下查询:
SELECT `Membership`.`id`,
`Membership`.`created`,
`user`.`id` AS `user.id`,
`user->posts`.`id` AS `user.posts.id`,
`user->posts`.`created` AS `user.posts.created`
FROM `membership` AS `Membership`
LEFT OUTER JOIN ( `user` AS `user` INNER JOIN `post` AS `user->posts`
ON `user`.`id` = `user->posts`.`user_id`
AND `user->posts`.`created` > 'Invalid date' )
ON `Membership`.`user_id` = `user`.`id`
AND (`user`.`deleted` = '9999-12-31 23:59:59')
WHERE `Membership`.`is_active` = true;
您可以看到它显示'$Membership.created$'
为Invalid date
。在 where 子句中使用联接表的列值的正确方法是什么?
解决方案
您可以使用别名为成员表的已创建字段作为成员资格_created 执行类似的操作
const expiredMemberships = await Membership.findAll({
include: [
{
model: User,
attributes: ['id'],
include: [
{
model: Post,
required: true,
attributes: ['id', 'created'],
where: {
created: {
[Op.gt]: 'membership_created',
},
},
},
],
},
],
attributes: ['id', ['created', 'membership_created']],
where: {
isActive: true,
},
});
推荐阅读
- arrays - 如何交换奇数数组?
- memory - 块的头部是如何在堆中格式化的?
- prolog - 关系语言描述了哪些类别?
- c# - ASP.NET 按钮 onclick 没有到达后面的代码
- java - appium 中的连接重置(WebDriver 异常)
- java - 声明泛型类中定义的类型的变量时出现Boundmismatch错误
- javascript - 路径中最深文件夹的 Google Apps 脚本 getId()
- excel - 使用变体数组更新单元格
- javascript - 如何使用 Javascript 将 HTML 中的数字减 20
- php - 如何查看一段时间内执行了哪些php文件?