NPM ORM - 保存 hasOne 字段的更新

Posted

技术标签:

【中文标题】NPM ORM - 保存 hasOne 字段的更新【英文标题】:NPM ORM - Save update of hasOne Field 【发布时间】:2015-04-15 09:07:33 【问题描述】:

我有一个设置,我有一个在我的应用程序中具有特定角色的人。

我有以下型号

module.exports = function (orm, db) 
    var Person = db.define('person', 
        id:              type: 'serial', key: true ,
        name:            type: 'text' ,
        email:           type: 'text' ,
        password:        type: 'text' ,
        mobilenumber:    type: 'text' ,
        contract_id:     type: 'integer' ,
        role_id:         type: 'integer' ,
        status:          type: 'integer' ,
    );
  Person.hasOne('role', db.models.role,  autoFetch: true );
;

module.exports = function (orm, db) 
    var Role =  db.define('role', 
        id:              type: 'serial', key: true ,
        name:            type: 'text' ,
        description:     type: 'text' ,
    );
;

当创建一个具有特定角色的新人时,一切正常并分配了角色。

创建具有角色的新用户

模板

extends layout

block content
  div.container

    div.row
      form(id='user_form' action='create' method='post')
        p name:
        input(type='text' name='name')
        p email:
        input(type='text' name='email')
        p password:
        input(type='password' name='password')
        p mobilenumber:
        input(type='text' name='mobilenumber')
        p role
        select(size='5' name='role')
          each role in roles
            option(value="#role.id") #role
        input(type='submit' value='add')

控制器

app.get('/new', function (req, res) 
  req.models.role.all(function (err, roles) 
    res.render('new', roles:roles);
  );
);

app.post('/create', function (req, res) 
  var new_person = ;

  new_person.name = req.body.name;
  new_person.email = req.body.email;
  new_person.password = req.body.password;
  new_person.mobilenumber = req.body.mobilenumber;
  new_person.role_id = req.body.role;

  req.models.person.create(new_person, function (err, person) 
    if(err) throw err;
    res.redirect('/person');
  );
);

但是当我尝试更新一个条目时,每个更改的字段都会更新,除了 role_id

用角色更新现有用户

模板

extends layout

block content
  div.container

    div.row
      form(id='user_form' action='/person/update/#person.id' method='post')
        p name:
        input(type='text' name='name' value='#person.name')
        p email:
        input(type='text' name='email' value='#person.email')
        p password:
        input(type='password' name='password')
        p mobilenumber:
        input(type='text' name='mobilenumber' value='#person.mobilenumber')
        p role:
        select(size='5' name='role')
          each role in roles
            option(value="#role.id") #role
        input(type='submit' value='save')

控制器

app.get('/edit/:id', function (req, res) 
  req.models.person.get(req.params.id, function (err, person) 
    req.models.role.all(function (err, roles) 
      res.render('edit', person: person, roles: roles);
    );
  );
);

app.post('/update/:id', function (req, res) 

  req.models.person.get(req.params.id, function (err, person) 
    person.name = req.body.name;
    person.email = req.body.email;
    person.password = req.body.password;
    person.mobilenumber = req.body.mobilenumber;
    person.role_id = req.body.role;
    console.log(req.body.role); // even prints the correct id when updated

    person.save(function (err) 
      if(err) throw err;
      res.redirect('/person');
    );
  );

我什至在更新字段时收到正确的role_id。由于在更新中保存其他属性有效并且role_id 只是我不明白的人的属性,为什么这不可行。如果您需要更多代码,请告诉我。我现在真的被困住了。有人有同样的经历吗?

编辑:我什至尝试将其转换为 int 但这也没有改变任何东西person.role_id = parseInt(req.body.role);

【问题讨论】:

【参考方案1】:

在这种情况下,我必须使用 setRole 来为 hasOne 关系保存条目。

app.post('/update/:id', function (req, res) 

  req.models.person.get(req.params.id, function (err, person) 
    person.name = req.body.name;
    person.email = req.body.email;
    if (req.body.password)  person.password = req.body.password; 
    person.mobilenumber = req.body.mobilenumber;

    req.models.role.get(req.body.role, function (err, role) 
      if(err) throw err;
      person.setRole(role, function (err) 

        person.save(function (err) 
          if(err) throw err;
          res.redirect('/person');
        );
      );
    );
  );
);

【讨论】:

【参考方案2】:
for (var j in originEntity) 
    if (_.isObject(originEntity[j])) 
        delete originEntity[j];
    

请尝试一下,我认为原因是因为您仅在自动获取的对象仍然存在时更改了相关键。

【讨论】:

以上是关于NPM ORM - 保存 hasOne 字段的更新的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP:hasOne 相关表在更新时保存多个条目

TP5模型belongsTo和hasOne的区别

tp5模型belongsTo和hasOne的区别

TP5模型belongsTo和hasOne这两个方法的区别

Sequelize ORM中HasOne和BelongsTo的区别

laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别