Sequelize MySQL – 获取所有包含一个ID的关联(belongsToMany)
Sequelize MySQL – Get all associations that contain an ID (belongsToMany)
我正在构建一个应用程序,我想在其中构建一个用户过滤器。现在我正在努力查询所有使用特定 ID 的语言的用户。我想 return 该用户使用他会说的所有语言,但是目前仅 return 使用特定语言的用户续集。
我读到在 Postgres 中这个问题可以通过 [Op.contains]
运算符轻松解决,但是因为我使用的是 MySQL,所以这个运算符不是可用。
我有一个模型 User 和 Language 通过连接 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) 知道的每种语言提供一行。
我正在构建一个应用程序,我想在其中构建一个用户过滤器。现在我正在努力查询所有使用特定 ID 的语言的用户。我想 return 该用户使用他会说的所有语言,但是目前仅 return 使用特定语言的用户续集。
我读到在 Postgres 中这个问题可以通过 [Op.contains]
运算符轻松解决,但是因为我使用的是 MySQL,所以这个运算符不是可用。
我有一个模型 User 和 Language 通过连接 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) 知道的每种语言提供一行。