序列化:使用现有关联创建实例

时间:2018-08-21 15:46:54

标签: sql node.js postgresql sequelize.js

尝试获得续集以返回具有现有关联的新创建对象。我的目标是创建一个与现有组织有关联的新用户,并同时返回两者。

user.model.js:

export default (sequelize, DataTypes) => {
  const User = sequelize.define('user', {
    email: {
      type: DataTypes.STRING,
      unique: true,
    },
  });
  User.associate = (models) => {
    User.belongsTo(models.Organisation, {
      foreignKey: {
        name: 'organisationId',
        field: 'organisation_id',
      },
    });
  };
  return User;
};

organisation.model.js:

export default (sequelize, DataTypes) => {
  const Organisation = sequelize.define('organisation', {
    name: {
      type: DataTypes.STRING,
      unique: true,
    },
  });
  return Organisation;
};

成功:获取现有用户

我可以使用include选项进行查询来检索现有用户及其组织。

const user = models.User.findOne({
  where: {
    email: 'existing@user.com',
  },
  include: [
    { model: models.Organisation, attributes: ['name'] },
  ],
});

失败:创建新用户

已插入实例,但查询无法返回组织属性。

const user = models.User.create({
  email: 'new@user.com',
  organisationId: 'existing-organisation-id'
}, {
  include: [
    { model: models.Organisation, attributes: ['name'] },
  ],
});

成功:创建一个新用户并对其进行查询

插入

实例,然后使用与组织数据一起检索的另一个查询。问题在于它需要两个查询到数据库。只需一个,

models.User.create({
  email: 'new@user.com',
  organisationId: 'existing-organisation-id'
}).then(() => {
  models.User.findOne({
    where: {
      email: 'new@user.com',
    },
    include: [
      { model: models.Organisation, attributes: ['name'] },
    ],
  });
});

我已经仔细阅读了文档,但我想我一定错过了一些东西。我要连接的数据库是 PostgreSQL 。非常感谢有人为我指出正确的方向。

1 个答案:

答案 0 :(得分:2)

我认为尚不支持:

  

options.include:包含选项的数组-用于构建   预提取/包含的模型实例

您可以使用include来同时创建关联的数据,但您不能只是这样获取数据

但是更简单的方法是:

models.User.create({
  email: 'new@user.com',
  organisationId: 'existing-organisation-id'
}).then((user) => {
    user.getOrganisation().then(org => {
        console.log(user,org); // <------ Check the console
    });
});