Sequelize many to many order association table 按自定义列
Sequelize many to many order association table by custom column
我正在用 electron 和 MySQL
构建一个桌面应用程序
1- 如何在多对多关联
中按自定义列对关联结果进行排序 table
//Company model
const Company = sequelize.define("Company", {
name: {
type: DataTypes.STRING,
allowNull: false,
},
});
//Branch Model
const Branch = sequelize.define("Branch", {
name: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.STRING,
},
});
//Associations
//join table
const CompanyBranch = sequelize.define("CompanyBranch",
{
order: {
type: DataTypes.INTEGER,
},
});
Branch.belongsToMany(Company, {
through: CompanyBranch,
as: "Branches",
});
Company.belongsToMany(Branch, {
through: CompanyBranch,
});
2- 如何将结果映射到正确的形状而不是嵌套对象。
注意:在 JavaScript Branch.order //=> undefined
我的查询
//query
const companies = await Company.findAll({include: [Branch]})
//result
{
//company attrs
Branches: [
{id: 1, name: "branch 1", description: null,
CompanyBranch: { CompanyId: 1, ActivityId: 1, BranchId: 1, order: 1}]
}
我想要的结果
{
//company attrs
Branches: [
{id: 1, name: "branch 1", description: null, order: 1}]
}
您可以尝试使用 attributes
选项将 CompanyBranch.order
字段包含为 Branch 的 order
字段:
const companies = await Company.findAll({
include: [
{
model: Branch,
attributes: ['id', 'name', 'description', [Sequelize.col('CompanyBranch.order'), 'order']]
}
]})
更新
如果您希望按 CompanyBranch.order
排序,那么最好添加从 Company
到 CompanyBranch
以及从 CompanyBranch
到 Branch
的关联(hasMany
和 belongsTo
分别)并像这样使用它们:
Company.hasMany(CompanyBranch);
CompanyBranch.belongsTo(Branch);
...
const companies = await Company.findAll({
include: [
{
model: CompanyBranch,
attributes: ['order'],
include: [{
model: Branch,
attributes: ['id', 'name', 'description']
},
}],
order: [['CompanyBranch', 'order', 'ASC']]
})
即使在 CompanyBranch
级别,您也可以使用 ['AssociationName.field', 'alias']
[=26 等符号指示您希望从 CompanyBranch
和 Branch
获得哪些字段=]
解决方案是使用 Sequelize literal 按自定义连接 table 列排序
const companies = await Company.findAll({
include: [Branch],
order: [[Sequelize.literal("`Branches->CompanyBranch`.`order`"), "ASC"]]
})
我正在用 electron 和 MySQL
构建一个桌面应用程序1- 如何在多对多关联
中按自定义列对关联结果进行排序 table //Company model
const Company = sequelize.define("Company", {
name: {
type: DataTypes.STRING,
allowNull: false,
},
});
//Branch Model
const Branch = sequelize.define("Branch", {
name: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.STRING,
},
});
//Associations
//join table
const CompanyBranch = sequelize.define("CompanyBranch",
{
order: {
type: DataTypes.INTEGER,
},
});
Branch.belongsToMany(Company, {
through: CompanyBranch,
as: "Branches",
});
Company.belongsToMany(Branch, {
through: CompanyBranch,
});
2- 如何将结果映射到正确的形状而不是嵌套对象。
注意:在 JavaScript Branch.order //=> undefined
我的查询
//query
const companies = await Company.findAll({include: [Branch]})
//result
{
//company attrs
Branches: [
{id: 1, name: "branch 1", description: null,
CompanyBranch: { CompanyId: 1, ActivityId: 1, BranchId: 1, order: 1}]
}
我想要的结果
{
//company attrs
Branches: [
{id: 1, name: "branch 1", description: null, order: 1}]
}
您可以尝试使用 attributes
选项将 CompanyBranch.order
字段包含为 Branch 的 order
字段:
const companies = await Company.findAll({
include: [
{
model: Branch,
attributes: ['id', 'name', 'description', [Sequelize.col('CompanyBranch.order'), 'order']]
}
]})
更新
如果您希望按 CompanyBranch.order
排序,那么最好添加从 Company
到 CompanyBranch
以及从 CompanyBranch
到 Branch
的关联(hasMany
和 belongsTo
分别)并像这样使用它们:
Company.hasMany(CompanyBranch);
CompanyBranch.belongsTo(Branch);
...
const companies = await Company.findAll({
include: [
{
model: CompanyBranch,
attributes: ['order'],
include: [{
model: Branch,
attributes: ['id', 'name', 'description']
},
}],
order: [['CompanyBranch', 'order', 'ASC']]
})
即使在 CompanyBranch
级别,您也可以使用 ['AssociationName.field', 'alias']
[=26 等符号指示您希望从 CompanyBranch
和 Branch
获得哪些字段=]
解决方案是使用 Sequelize literal 按自定义连接 table 列排序
const companies = await Company.findAll({
include: [Branch],
order: [[Sequelize.literal("`Branches->CompanyBranch`.`order`"), "ASC"]]
})