簡體   English   中英

如何配置sequelize以一對多關聯返回嵌入式數組?

[英]How to configure sequelize to return embedded array in a one-to-many association?

這是交易:

我有兩個模型-用戶和房屋
用戶有很多房子
房屋屬於用戶

我輸入了一些虛擬數據並創建了一個最小的Express應用程序來提供api
我想返回一個用戶列表,並包括每個用戶的房屋。

api端點如下所示:

router.get('/users', function(req, res,next) {
  models.User.findAll({
      include: [ models.House ],
      raw: true // returns result-set as a clean json...
  })
  .then(function(users) {
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});

Sequelize的默認行為是返回相同User數據的多個實例,每次都帶有不同的內部數據,如下所示:

[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 1,
    Houses.description: "house 1 desc",
    Houses.user_id: 1
  },
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 3,
    Houses.description: "house 3 desc",
    Houses.user_id: 1
  },
  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses.id: 2,
    Houses.description: "house 2",
    Houses.user_id: 2
  }
]

我可以在擁有的用戶中嵌入一系列房屋嗎?
有沒有一種方法可以將Sequelize配置為返回數據,如下所示:

[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses:[
       {
          id: 1,
          description: "house 1 desc",
          user_id: 1
       },
       {
          id: 3,
          description: "house 3 desc",
          user_id: 1
       },
    ]
  },

  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses:[
       {
          id: 2,
          description: "house 2",
          user_id: 2
       }
    ]
  }
]

如果答案是否定的,您是否可以推薦一種將數據解析為這種結構的方法?

用戶模型:

module.exports = function(sequelize, DataTypes) {

  var User = sequelize.define('User', {

        first_name: DataTypes.STRING,
        last_name: DataTypes.STRING,
        email: DataTypes.STRING

    }, 
    {
      classMethods: {
        associate: function(models) {
          User.hasMany(models.House)
        }
      }
  });

  return User;
};

房子模型:

module.exports = function(sequelize, DataTypes) {
  var House = sequelize.define("House", {
      description: DataTypes.TEXT
  }, 
  {
    classMethods: {
      associate: function(models) {
        House.belongsTo(models.User);
      }
    }
  });

  return House;
};

我有一個類似的問題,只是找到了一種適合我的解決方案:

router.get('/users', function(req, res, next) {
  models.User.findAll({
      include: [ {model: models.House, as: 'houses'} ],
      raw: false // returns result-set as sequelize object...
  })
  .then(function(users) {
      users = users.get(); //turns sequelize object into json
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});

將raw設置為false(或將其默認設置為false),然后,每當您需要在res.json之前獲取原始json時,請使用users.get() (“ users”現在是一個sequelize實例)即可獲取該sequelize對象的json,現在是具有其關聯數組的對象!

嘗試將'as'選項添加到User-> House 1:n關系

module.exports = function(sequelize, DataTypes) {

      var User = sequelize.define('User', {

            first_name: DataTypes.STRING,
            last_name: DataTypes.STRING,
            email: DataTypes.STRING

        }, 
        {
          classMethods: {
            associate: function(models) {
              User.hasMany(models.House, {as: 'houses'})
            }
          }
      });

      return User;
    };

並相應地更新查詢

router.get('/users', function(req, res,next) {
  models.User.findAll({
      include: [ {model: models.House, as: 'houses'} ],
      raw: true // returns result-set as a clean json...
  })
  .then(function(users) {
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM