【问题标题】:Sequelize, problem getting associations to return续集,让关联返回的问题
【发布时间】:2011-09-15 14:00:52
【问题描述】:

我目前正在尝试使用 Sequelize 并有两个对象,一个 PersonPosition,在获取我想要获得他们位置的人员列表时。

型号:

var User = sequelize.define('user', {
    first_name: Sequelize.STRING,
    last_name: Sequelize.STRING 
});

var Position = sequelize.define('position', {
    name: Sequelize.STRING,
    affiliation: Sequelize.STRING
});

Position.hasMany(User, { foreignKey : 'position_id' });
User.belongsTo(Position, { foreignKey : 'position_id'});

我的查询:

User.findAll({ fetchAssociations: true }, function(results) {
    //I've tried doing some work in here, but haven't found the correct procedure. 
}).on('success', function(results) {
    res.render('users', {
        title: 'user page',
        users: results
    });
});

查看日志它根本不会查询Person。我需要使用查询链吗?从文档中我发现它似乎应该自动获取关联。

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    这允许序列化一个 json 用于关于模型的任何操作。读完,很好,我认为这是最好的方法

    sequelize-virtual-fields

    // define models 
    var Person = sequelize.define('Person', { name: Sequelize.STRING });
    var Task = sequelize.define('Task', {
    name: Sequelize.STRING,
    nameWithPerson: {
        type: Sequelize.VIRTUAL,
        get: function() { return this.name + ' (' + this.Person.name + ')' }
        attributes: [ 'name' ],
        include: [ { model: Person, attributes: [ 'name' ] } ],
        order: [ ['name'], [ Person, 'name' ] ]
    }
    });
    
    // define associations 
    Task.belongsTo(Person);
    Person.hasMany(Task);
    
    // activate virtual fields functionality 
    sequelize.initVirtualFields();
    

    【讨论】:

      【解决方案2】:

      从 2013 年 4 月的 v1.7.0 开始,您只需将您的 Associations 扩展为:

      Position.hasMany(User, {foreignKey : 'position_id', as: 'User'});
      User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});
      

      然后找到所有具有相关职位的用户

      User.findAll({
            include: [{
              model: Position, as: 'Posit'
            }]
      }).success(function(match) {
          // your logic
      });
      

      【讨论】:

        【解决方案3】:

        好的,这里有一个如何解决您的问题的完整示例(是的,这很垃圾):

        User.findAll().on('success', function(users) {
          var chainer = new Sequelize.Utils.QueryChainer
            , _users  = []
        
          users.forEach(function(u) {
            var emitter = new Sequelize.Utils.CustomEventEmitter(function() {
              u.getPosition().on('success', function(pos) {
                _users.push({user: u, position: pos})
                emitter.emit('success')
              })
            })
            chainer.add(emitter.run())
          })
          chainer.run().on('success', function() {
            res.render('users', {
              title: 'user page',
              users: _users
            })
          })
        })
        

        这将首先获取所有用户,然后获取每个用户的位置并将其保存在_users-array中。之后它呈现页面。它没有经过测试,但应该可以解决问题。

        【讨论】:

        • 感谢sn-p,我会玩这个。
        • 您的代码对我帮助很大。如果我问您究竟是从哪里得到实现 CustomEventEmitter 的想法,您介意吗?因为那甚至不在 API 中。
        • 实际上有问题,因为它不断返回 _users 填充最后输入的用户。 :|
        • 通过将 forloop 的内部嵌入另一个匿名 fx whew 来修复它
        • 这篇文章帮助我检索关联的对象。我正要放弃,但我很幸运找到了这篇文章。 @sdepold 您能否在您的文档中写更多关于如何执行此操作的示例。谢谢!
        【解决方案4】:

        因为我为 1.0 重写了 sequelize,所以我删除了对 fetchAssociations 的支持。我将在接下来的几周内添加它。但是让我们看一下您的代码:

        您正在使用类似下划线的列名,因此您可能希望对自动生成的列使用下划线选项:http://www.sequelizejs.com/?active=usage#usage --> 向下滚动一点或搜索下划线。这可能会为您节省 belongsTo/hasMany 的选项。

        你想用 findAll 做的是什么。像这样:

        User.findAll().on('success', function(users) {
          // asd
        })
        

        正如我刚刚注意到的......获取所有关联对象有点棘手:D 现在就这么多。希望对您有所帮助。

        【讨论】:

        • 非常感谢您的回复。如果我理解正确,在 sequelize 的 v1.0 中目前没有获取关联对象的功能?感谢您提供关于下划线的提示,我目前正在针对一个简单但预先存在的数据库进行“概念证明”,我会注意这一点。
        • 哦,有关联支持,但不是通过 fetchAssociation。您可以执行 user.getPosition().on('success',... 我稍后会针对您的问题发布解决方法。
        • 哈,我不知道,我一定是在某些时候误读了一些东西,对此感到抱歉。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 2020-06-05
        • 2017-05-30
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多