【问题标题】:(Sequelize+Postgres+NodeJS) Inster FK (userID) from another table(Sequelize+Postgres+Node JS) 从另一个表插入 FK (userID)
【发布时间】:2016-02-14 23:07:27
【问题描述】:

我正在使用连接到 PostgreSQL 的 Sequelize,并且因为我想使用同步功能,所以我想准备有效的模型来在每个环境中创建表。

编辑:

钱包:

'use strict';

module.exports = function(db, DataTypes) {
  var Wallet = db.define('Wallet', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
      primaryKey: true
    },
    money: {
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: 0
    }
    createdAt: DataTypes.DATE,
    updatedAt: DataTypes.DATE
  }, {
    tableName: 'wallet',
    classMethods:{
      associate : function( models ) {
        Wallet.belongsTo( models.User,{ foreignKey : 'id_user'});
      }
    }

  });

  return Wallet;
};

用户:

'use strict';
var bcrypt = require('bcrypt-nodejs');
var crypto = require('crypto');
var moment = require('moment');
var models = require('./');


var afterCreateHook = function(user, options, fn) {
  models.Wallet.build({id_user: user.id}).save();
  fn(null, user);
};

module.exports = function(db, DataTypes) {
  var User = db.define('User', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
      primaryKey: true
    },
    password: DataTypes.STRING,
    email: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false,
      isEmail: true
    },
    login: {
      type: DataTypes.STRING,
      unique: true,
      allowNull: false
    }
  }, {
    tableName: 'pl_users',
    instanceMethods: instanceMethods,
    classMethods: {
      associate : function( models ) {
        User.hasOne( models.Wallet);
      }

    },
    hooks: {
      afterCreate: afterCreateHook
    }
  });

  return User;
};

为什么

models.Wallet.build({id_user: user.id}).save();

不工作?正在创建帐户,然后我想创建具有特定 user_id 的钱包。我什至没有错误...

请帮忙!

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    你应该从 sequelize docs 检查relations

    在您的情况下,您需要定义:

    Wallet.belongsTo(User,{foreignKey: 'id_user'});
    

    这会将 id_user 添加到 Wallet 模型中,因此您无需在 WalletModel 中指定 id_user 属性。

    如果你使用sequelize import function,你应该在“associate”类方法中添加关系,如下所示:

    module.exports = function(db, DataTypes) {
      var Wallet = db.define('Wallet', {
        id: {
          type: DataTypes.INTEGER,
          autoIncrement: true,
          allowNull: false,
          primaryKey: true
        },
        pin: {
          type: DataTypes.INTEGER,
          allowNull: false,
          defaultValue: 0
        },
        money: {
          type: DataTypes.STRING,
          allowNull: false,
          defaultValue: 0
        },
        createdAt: DataTypes.DATE,
        updatedAt: DataTypes.DATE
      }, {
        tableName: 'Wallet',
        classMethods:{
               associate : function( models ) {
                    Wallet.belongsTo( models.User,{ foreignKey : 'id_user'});
                }
        }
      });
    

    【讨论】:

    • 如果您需要为现有用户创建一个新钱包,您可以使用 user.createWallet({ })。
    • 你能说得更具体点吗?它的好主意,但我不知道把它放在哪里......现在它正在使用:var afterCreateHook = function(user, options, fn) { this.associations.Wallet.target.create({ id_user: user.id }) .then(function(otherModel) { fn(null, user); }) .catch(function(err) { return; }); };
    • 我需要更多信息,如果你有一个名为 user 的 User 实例,它有关联方法,其中之一是 createWallet ,因为 user 与钱包有关联,所以你可以这样做:user.createWallet ({pin:123456,money:"PEN"}).then(..).catch(..)
    猜你喜欢
    • 2016-09-29
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多