【问题标题】:Sequelize Can't Add Value into Associated ObjectSequelize 无法将值添加到关联对象中
【发布时间】:2016-01-08 10:54:39
【问题描述】:

我正在尝试创建一个具有子对象(关联)的对象,该子对象的 Id 作为值传递给其属性。我尝试按照文档进行操作,但 SQL 命令没有传递任何值。

这是 SQL 查询:

INSERT INTO `organization` (`organization_id`,`organization_name`,`admin`,`updatedAt`,`createdAt`) VALUES (DEFAULT,'dfsadfadsfa','ter@test.cm','2016-01-08 02:23:04','2016-01-08 02:23:04');

没有引用user

这是插入组织的路线:

var express = require('express');
var appRoutes   = express.Router();
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var models = require('../models/db-index');

    appRoutes.route('/sign-up/organization')

        .get(function(req, res){
            models.User.find({
                where: {
                    user_id: req.user.email
                }, attributes: [ 'user_id', 'email'
                ]
            }).then(function(user){
                res.render('pages/sign-up-organization.hbs',{
                    user: req.user
                });
            })

        })

        .post(function(req, res, user){
            models.Organization.create({
                organizationName: req.body.organizationName,
                admin: req.body.admin,
                User: [{
                    organizationId: req.body.organizationId
                }]
            }, { include: [models.User] }).then(function(){
                console.log(user.user_id);
                res.redirect('/app');
            }).catch(function(error){
                res.send(error);
                console.log('Error at Post');
            })
        });

这是表单提交:

<div class="container">
        <div class="col-md-6 col-md-offset-3">
            <form action="/app/sign-up/organization" method="post">
                <p>{{user.email}}</p>
                <input type="hidden" name="admin" value="{{user.email}}">
                <input type="hidden" name="organizationId">
                <label for="sign-up-organization">Company/Organization Name</label>
                <input type="text" class="form-control" id="sign-up-organization"  name="organizationName" value="" placeholder="Company/Organization">
                <br />
                    <button type="submit">Submit</button>
            </form>

user.js 模型:

var bcrypt   = require('bcrypt-nodejs');

module.exports = function(sequelize, DataTypes) {

var User = sequelize.define('user', {
    user_id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    firstName: {
        type: DataTypes.STRING,
        field: 'first_name'
    },
    lastName: {
        type: DataTypes.STRING,
        field: 'last_name'
    },
    email: {
        type: DataTypes.STRING,
        isEmail: true,
        unique: true
    },
    password: DataTypes.STRING,
    organizationId: {
        type: DataTypes.INTEGER,
        field: 'organization_id',
        allowNull: true
    }
}, {
    freezeTableName: true,
    classMethods: {
        generateHash: function(password) {
            return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },
    },
    instanceMethods: {
        validPassword: function(password) {
            return bcrypt.compareSync(password, this.password);
        },
    },


});
    return User;
}

organization.js 模型:

module.exports = function(sequelize, DataTypes) {

var Organization = sequelize.define('organization', {
    organizationId: {
        type: DataTypes.INTEGER,
        field: 'organization_id',
        autoIncrement: true,
        primaryKey: true
    },
    organizationName: {
        type: DataTypes.STRING,
        field: 'organization_name'
    },
    admin: DataTypes.STRING,
    members: DataTypes.STRING
},{
    freezeTableName: true,
    classMethods: {
        associate: function(db) {
            Organization.hasMany(db.User, {foreignKey: 'user_id'});
        },
    },
});

    return Organization;
}

db-index.js:两者关联的地方:

var Sequelize = require('sequelize');
var path = require('path');
var config = require(path.resolve(__dirname, '..', '..','./config/config.js'));
var sequelize = new Sequelize(config.database, config.username, config.password, {
    host:'localhost',
    port:'3306',
    dialect: 'mysql'
});

sequelize.authenticate().then(function(err) {
    if (!!err) {
        console.log('Unable to connect to the database:', err)
    } else {
        console.log('Connection has been established successfully.')
    }
});

var db = {}

db.Organization = sequelize.import(__dirname + "/organization");

db.User = sequelize.import(__dirname + "/user");

db.Annotation = sequelize.import(__dirname + "/annotation");

db.Organization.associate(db);
db.Annotation.associate(db);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

sequelize.sync();

module.exports = db;

【问题讨论】:

  • 如我所见,您是否在表单提交中尝试过
    ?它不是 /app 因为它调用路由文件。
  • 嘿,抱歉,我在该文件中调用的所有路由前添加了 /app。这不是问题

标签: express sequelize.js


【解决方案1】:

当我使用 Sequelize 时,我通常会创建一个函数,该函数使用 build 方法创建 sequelize 模型的实例,并使用该实例将该实例保存到数据库中。使用返回的实例,您可以做任何您需要的事情。

var instance = models.Organization.build(data);
instance.save().then(function(savedOrgInstance){
    savedOrgInstance.createUser(userData).then(function(responseData){
    //do whatever you want with the callback })
})

我不能说我见过你写的 create 语句。额外的 include 语句有什么用?

这应该为新创建的用户提供您正在寻找的关联。 您应该查看文档中的 setAssociaton、getAssociation、createAssociation 方法。 http://docs.sequelizejs.com/en/latest/docs/associations/

【讨论】:

  • 嘿,Cameron,我指的是文档中的这一部分 docs.sequelizejs.com/en/latest/docs/associations/…
  • 在路线的这一点上,我已经创建了一个授权用户,这就是为什么我能够访问用户模型属性,但由于某种原因我当前的创建方法没有找到要传递给用户属性的 organization_id 值。这是我的假设
  • 哈哈 以前没用过那个方法,没想到。不过,该文档很有帮助。尝试做用户: [{ ... : ...}] 而不是用户。复数可能导致错误。要使该方法起作用,您可能还需要 User 模型中的 User.belongsTo(models.Organization......) 吗?只有两个想法!
  • 如果您的用户已经创建,那么包含已创建用户的创建语句可能不起作用?似乎它会新创建两个实例。就像我提到的那样,您可能可以创建组织,然后如果您有用户 ID,您可能只需调用 newOrgInstance.setUser(userData 或实例)。我想这就是我不幸的全部!
  • 看来您可能是正确的,必须同时创建实例或等到创建组织实例然后将值应用于用户模型。我在声明中 console.logged 并返回 undefined for annotation 这是一个好兆头,表明这不会一起工作?
猜你喜欢
  • 2018-12-09
  • 2021-08-02
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多