【问题标题】:Sequelize set alias attributes name after join加入后序列化设置别名属性名称
【发布时间】:2018-02-06 23:04:51
【问题描述】:

在三个模型之间进行连接操作后,我收到了有效结果,但我将重命名 findAll 的连接操作生成的属性

查询:

const orchards = await db.Area.findAll({
        include: [db.AreaCoordinate, db.Crop],
        attributes: ['id', 'name']
      });

区域坐标模型:

module.exports = function (sequelize, DataTypes) {

  var AreaCoordinate = sequelize.define('AreaCoordinate', {
    latitude: {
      type: DataTypes.STRING(45),
      allowNull: true
    },
    longitude: {
      type: DataTypes.STRING(45),
      allowNull: true
    }
  }, {
    classMethods: {
      associate: function (models) {
        AreaCoordinate.belongsTo(models.Area, {foreignKey: 'areaId'});
      }
    }
  });

  return AreaCoordinate;
};

作物模型:

module.exports = function (sequelize, DataTypes) {

  var Crop = sequelize.define('Crop', {
    name: {
      type: DataTypes.STRING(45),
      allowNull: true
    },
    lang: {
      type: DataTypes.STRING(45),
      allowNull: true
    }
  }, {
    classMethods: {
      associate: function (models) {
        Crop.hasMany(models.Area, {foreignKey:'cropId'})
      }
    }
  });

  return Crop;
};

区域模型:

module.exports = function (sequelize, DataTypes) {

  var Area = sequelize.define('Area', {
    name: DataTypes.STRING
  }, {
    classMethods: {
      associate: function (models) {
        // example on how to add relations
        Area.belongsTo(models.Crop, {foreignKey: 'cropId'});
        Area.belongsTo(models.Orchard, {as: 'orchard'});
        Area.hasMany(models.AreaCoordinate, {foreignKey:'areaId'})
      }
    }
  });

  return Area;
};

我会从查询中收到这样的 JSON:

{
    "status": 200,
    "status_message": "OK",
    "data": {
        "orchard": [
            {
                "name": "pantano",
                "coordinates": [
                    {
                        "id": 115,
                        "latitude": "1",
                        "longitude": "2",
                        "createdAt": "2017-08-29T12:03:11.000Z",
                        "updatedAt": "2017-08-29T12:03:11.000Z",
                        "areaId": 28
                    },
                    {
                        "id": 116,
                        "latitude": "1",
                        "longitude": "2",
                        "createdAt": "2017-08-29T12:03:11.000Z",
                        "updatedAt": "2017-08-29T12:03:11.000Z",
                        "areaId": 28
                    }
                ],
                "cropId": 10
            }
        ]
    }
}

但我收到的是(查看区域坐标和裁剪):

{
    "status": 200,
    "status_message": "OK",
    "data": {
        "orchard": [
            {
                "name": "pantano",
                "AreaCoordinates": [
                    {
                        "id": 115,
                        "latitude": "1",
                        "longitude": "2",
                        "createdAt": "2017-08-29T12:03:11.000Z",
                        "updatedAt": "2017-08-29T12:03:11.000Z",
                        "areaId": 28
                    },
                    {
                        "id": 116,
                        "latitude": "1",
                        "longitude": "2",
                        "createdAt": "2017-08-29T12:03:11.000Z",
                        "updatedAt": "2017-08-29T12:03:11.000Z",
                        "areaId": 28
                    }
                ],
                "Crop": 10
            }
        ]
    }
}

我尝试为 AreaCoordinatesCrop 设置一些别名,但找不到解决方案。提前感谢您的支持。

【问题讨论】:

    标签: mysql node.js express sequelize.js node-modules


    【解决方案1】:

    这样写查询:

    const result = await Table.findAll({
      attributes: ['id', ['foo', 'bar']] //id, foo AS bar
    });
    

    【讨论】:

      【解决方案2】:

      Sequelize 关联中默认设置属性名称为相关模型名称。对于您的情况,相关模型名为 AreaCoordinates,因此返回的属性名称将是 AreaCoordinates。您应该使用 as。修改你的并试试这个:

      findAll 查询:

      const orchards = await db.Area.findAll({
          include: [
              {
                  model: db.AreaCoordinate,
                  as: 'coordinates'
              }, {
                  model: db.Crop,
                  as: 'cropId',
                  attribute: ['id']
              }],
          attributes: ['id', 'name']
      });
      

      区域模型

      module.exports = function (sequelize, DataTypes) {
      
      var Area = sequelize.define('Area', {
          name: DataTypes.STRING
      }, {
          classMethods: {
              associate: function (models) {
              // example on how to add relations
                  Area.belongsTo(models.Crop, {
                      foreignKey: 'cropId',
                      as: 'cropId'
                  });
                  Area.belongsTo(models.Orchard, {as: 'orchard'});
                  Area.hasMany(models.AreaCoordinate, {
                      foreignKey:'areaId',
                      as: 'coordinates'
                  })
              }
          }
      });
      
      return Area;
      };
      

      【讨论】:

        猜你喜欢
        • 2022-11-02
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 2014-04-24
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多