首页 > 解决方案 > 使用 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 子句中使用联接表的列值的正确方法是什么?

标签: mysqlsequelize.js

解决方案


您可以使用别名为成员表的已创建字段作为成员资格_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,
    },
});

推荐阅读