续集选择并包含另一个表别名

Posted

技术标签:

【中文标题】续集选择并包含另一个表别名【英文标题】:sequelize select and include another table alias 【发布时间】:2019-04-06 15:55:47 【问题描述】:

我正在使用 sequelize 访问 postgres 数据库,我想查询一个城市,例如包括“建筑物”表,但我想将输出重命名为“建筑物”并返回 http 响应,但我有这个错误:

SequelizeEagerLoadingError: building 使用别名关联到城市。你已经 e 包含一个别名(建筑物),但它与您的 a 中定义的别名不匹配 协会。

    City.findById(req.params.id,
      include: [
        
          model: Building, as: "buildings"
        
      ]
    ).then(city =>
      console.log(city.id);
         res.status(201).send(city);
    ) .catch(error => 
     console.log(error);
     res.status(400).send(error)
   );

城市模型

            const models = require('../models2');
            module.exports = (sequelize, DataTypes) => 
              const City = sequelize.define('city', 
              name:  type: DataTypes.STRING, allowNull: false ,
                status:  type: DataTypes.INTEGER, allowNull: false ,
                latitude:  type: DataTypes.BIGINT, allowNull: false ,
                longitude:  type: DataTypes.BIGINT, allowNull: false ,

              ,  freezeTableName: true);
              City.associate = function(models) 
                // associations can be defined here
                 City.hasMany(models.building,as: 'building', foreignKey: 'cityId')
              ;
              return City;
            ;

【问题讨论】:

检查别名buildings是否与定义相同,请同时发布城市型号代码 哦我明白了,别名必须与模型匹配?如果更改模型中的别名,是否必须创建 sequelize 迁移? 不,只要改名字就行了,瞧,你很高兴 非常感谢!成功了! 【参考方案1】:

正如您在下面的代码中定义的别名是 building

City.hasMany(models.building,as: 'building', foreignKey: 'cityId')

但在查询中,您使用的是buildings

include: [
  
     model: Building, as: "buildings" // <---- HERE
  
]

应该是building

include: [
   
         model: Building, as: "building" // <---- HERE
   
]

【讨论】:

@John ,很高兴知道。顺便说一句,快乐编码 :) 为什么 sequelize 团队不把这个写到它的文档中?有趣。

以上是关于续集选择并包含另一个表别名的主要内容,如果未能解决你的问题,请参考以下文章

续集包含即使它为空

findall 多对多续集

根据另一个表中的列值选择一个表中的行?

为啥选择不同存储的'As T'以及如何别名?

从一个表中选择行并插入到另一个表中

MySQL:如何根据从另一个表中选择的值填充现有表的新列[关闭]