Sequelize MySQL – 获取所有包含一个ID的关联(belongsToMany)

Sequelize MySQL – Get all associations that contain an ID (belongsToMany)

我正在构建一个应用程序,我想在其中构建一个用户过滤器。现在我正在努力查询所有使用特定 ID 的语言的用户。我想 return 该用户使用他会说的所有语言,但是目前仅 return 使用特定语言的用户续集。

我读到在 Postgres 中这个问题可以通过 [Op.contains] 运算符轻松解决,但是因为我使用的是 MySQL,所以这个运算符不是可用。

我有一个模型 UserLanguage 通过连接 table UserLanguage.

非常感谢!

User.tsx

const User = sequelize.define<UserInstance>(
  "user",
  {
    id: {
      type: DataTypes.UUID,
      allowNull: false,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
    },
    firstName: {
      type: DataTypes.STRING,
      field: "first_name",
    },
    ...
  },
  {
    timestamps: false,
  }
);

Language.tsx

const Language = sequelize.define<LanguageInstance>(
  "language",
  {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
    },
  },
  {
    timestamps: false,
  }
);

用户Language.tsx

const UserLanguage = sequelize.define<UserLanguageInstance>(
  "user_language",
  {},
  {
    timestamps: false,
  }
);

Language.belongsToMany(User, {
  foreignKey: "fk_language",
  through: UserLanguage,
});
User.belongsToMany(Language, {
  foreignKey: "fk_user",
  through: UserLanguage,
});

我的查询:

await User.findAll({
      attributes: [
        "id",
        "firstName",
      ],
      include: [
        {
          model: Language,
          through: {
            attributes: [],
            where: {
              fk_language: 1,
            }
          },
          required: true,
        },
      ],
    })

当我过滤 id=1 的语言时,这将是所需的输出:

[
  {
    "id": {
      "type": "Buffer",
      "data": [
        80, 21, 118, 100, 88, 177, 72, 2, 160, 130, 111, 173, 245, 65, 109, 244
      ]
    },
    "firstName": "Candace",
    "languages": [
      {
        "id": 1,
        "name": "en"
      },
      {
        "id": 5,
        "name": "fr"
      },
      {
        "id": 8,
        "name": "jp"
      }
    ]
  },
  {
    "id": {
      "type": "Buffer",
      "data": [
        144, 63, 87, 23, 56, 130, 67, 28, 161, 194, 38, 191, 212, 53, 31, 60
      ]
    },
    "firstName": "Walter",
    "languages": [
      {
        "id": 1,
        "name": "en"
      },
      {
        "id": 2,
        "name": "es"
      },
      {
        "id": 4,
        "name": "de"
      },
      {
        "id": 5,
        "name": "fr"
      }
    ]
  }
]

但是,我将只获取具有 id=1 的元素的语言数组:

[
  {
    "id": {
      "type": "Buffer",
      "data": [
        80, 21, 118, 100, 88, 177, 72, 2, 160, 130, 111, 173, 245, 65, 109, 244
      ]
    },
    "firstName": "Candace",
    "languages": [
      {
        "id": 1,
        "name": "en"
      }
    ]
  },
  {
    "id": {
      "type": "Buffer",
      "data": [
        144, 63, 87, 23, 56, 130, 67, 28, 161, 194, 38, 191, 212, 53, 31, 60
      ]
    },
    "firstName": "Walter",
    "languages": [
      {
        "id": 1,
        "name": "en"
      }
    ]
  }
]

对我来说,听起来您需要嵌套选择或连接。如果您有一个 table 用户、一个 link table user-language 和一种语言 table,那么您可以使用 JOIN 将 table 连接在一起,假设您在 tables.

中有一个 userID 和一个 langID

所以:

SELECT * from UserTbl 
JOIN UserLanguageLinkTbl on UserTbl.UserID=UserLanguageLinkTbl.UserID 
JOIN LanguageTbl on UserLanguageLinkTbl.LangID=LanguageTbl.LangID
WHERE UserID=1

上面将为特定用户 (UserID=1) 知道的每种语言提供一行。