Sequelize 将一个 table 的两列连接到另一个 table 的同一列

Sequelize join two columns of one table to the same column of another table

我有一个 table RelationuserId1userId2基本上存储两个用户之间的关系,userId1userId2 是从 User tables id (PK) 列。

   id: {
        type: DataTypes.INTEGER.UNSIGNED,
        autoIncrement: true,
        primaryKey: true,
        allowNull: false,
    },
    userId1: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
    },
    userId2: {
        type: DataTypes.INTEGER.UNSIGNED,
        allowNull: false,
    },
    status: {
        type: DataTypes.ENUM,
    },

然后还有另一个 table 帖子 包含有关 post 的信息。

          id: {
                type: DataTypes.INTEGER.UNSIGNED,
                autoIncrement: true,
                primaryKey: true,
                allowNull: false,
          },
          content: {
                type: DataTypes.TEXT,
                allowNull: false,
          },
          postedBy: {
                type: DataTypes.INTEGER.UNSIGNED,
                allowNull: false,
          },

我只想获取 post 与我有关系的用户的列表,例如 朋友 ,这意味着我的 ID 假设是 1 并且它在 userId1 列和 userId2 列中有 id ,然后我想获取所有 posts 的值 2 来自 posts postedBy 列。 这种情况反之亦然,因为我的 id 可以在 userId2 列中,我需要获取值在 userId1[ 中的用户的所有 posts =55=]列。

我已经通读了所有的问题和答案,比如多个关联,但它对我不起作用。

这是我在帖子模型

中的关联
      Posts.hasOne(RelationModel, {
        foreignKey: 'userId1',
        sourceKey: 'postedBy',
        as: 'first',
      })

       Posts.hasOne(RelationModel, {
            foreignKey: 'userId2',
            sourceKey: 'postedBy',
            as: 'second',
        })

下面是我的包含数组。

          include:[
                   {
                    model: RelationModel,
                    as: 'first',
                    where: {
                        status: 'accepted',
                        [Op.or]: [
                            { userId1: request.user.id },
                            { userId2: request.user.id },
                        ],
                    },
                },
                {
                    model: RelationModel,
                    as: 'second',
                    where: {
                        status: 'accepted',
                        [Op.or]: [
                            { userId1: request.user.id },
                            { userId2: request.user.id },
                        ],
                    },
                }
               ]

由此生成的查询如下,其中 151 是登录用户 ID,表示我的 ID

SELECT 
    `posts`.*,
    `first`.*,
    `second`.*
FROM
    `posts` AS `posts`
        INNER JOIN
    `relations` AS `first` ON `posts`.`postedBy` = `first`.`userId1`
        AND (`first`.`userId1` = 151
        OR `first`.`userId2` = 151)
        AND `first`.`status` = 'accepted'
        INNER JOIN
    `relations` AS `second` ON `posts`.`postedBy` = `second`.`userId2`
        AND (`second`.`userId1` = 151
        OR `second`.`userId2` = 151)
        AND `second`.`status` = 'accepted'
WHERE
    `posts`.`deletedAt` IS NULL
ORDER BY `posts`.`id` ASC , `posts`.`id` ASC;

但我要构建的查询如下

SELECT 
    `posts`.*,
    `first`.*
FROM
    `posts` AS `posts`
        INNER JOIN
    `relations` AS `first` ON (`posts`.`postedBy` = `first`.`userId2`
        OR `posts`.`postedBy` = `first`.`userId1`)
        AND (`first`.`userId1` = 151
        OR `first`.`userId2` = 151)
        AND `first`.`isFriend` = TRUE
        AND `first`.`status` = 'accepted'
WHERE
    `posts`.`deletedAt` IS NULL
ORDER BY `posts`.`id` ASC , `posts`.`id` ASC;

如何在sequelize中构造这个查询?

您需要为关联中的每个关系以及查询的 include 指定唯一的 as 关键字。

Posts.hasOne(RelationModel, {
  foreignKey: 'userId1',
  sourceKey: 'postedBy',
  as: 'first',
});

Posts.hasOne(RelationModel, {
  foreignKey: 'userId2',
  sourceKey: 'postedBy',
  as: 'second',
});

然后当您查询时指定唯一的 as 来标识连接的关系

Post.findByPk(id, {
  include: [{
    model: RelationModel,
    as: 'first',
  },
  {
    model: RelationModel,
    as: 'second',
  }],
});