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 排序,那么最好添加从 CompanyCompanyBranch 以及从 CompanyBranchBranch 的关联(hasManybelongsTo 分别)并像这样使用它们:

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 等符号指示您希望从 CompanyBranchBranch 获得哪些字段=]

解决方案是使用 Sequelize literal 按自定义连接 table 列排序

const companies = await Company.findAll({
include: [Branch],
order: [[Sequelize.literal("`Branches->CompanyBranch`.`order`"), "ASC"]]
})