【问题标题】:Sequelize.js' association are not rendered on the pageSequelize.js 的关联没有呈现在页面上
【发布时间】:2012-07-13 09:16:15
【问题描述】:

我有两个模型。

var self = {
    User: sequelize.define('user', {
        id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},
        name: {type: Sequelize.STRING,allowNull: false}
    }),

    Role: sequelize.define('role', {
        id: {type: Sequelize.INTEGER,primaryKey: true,autoIncrement: true},      
        name: {type: Sequelize.STRING,allowNull: false} 
   })
}

我还指定了它们之间的关联。

self.User.belongsTo(self.Role);

控制器 user.js 的一部分:

list: function(req, res){
   models.User.findAll({offset: offset, limit: limit}).success(function (users) {
            if (req.params.format == 'html') {
                res.render('admin/user/list.html', {
                    title: 'Users',
                    layout: layout,
                    users: users
                });
            }   else if (req.params.format == 'json') {
                res.json(users);
            }
   }

查看list.html:

<% users.forEach(function(user){ %>
    <tr>
        <td><%= user.id %></td>
        <td><a href="/admin/user/<%= user.id %>/show.html"><%= user.name %></a></td>
        <td><%= user.getRole().name %></td>
    </tr>
<% } %>

如果我们调用/list.html,我们会为每个用户获取页面上未定义的角色。

如果我们调用 /list.json 我们会得到:

[{"id":1,"name":"user1", "role_id":1},
[{"id":2,"name":"user2", "role_id":1},
[{"id":3,"name":"user3", "role_id":2},
...

如何在 list.html 和 json 响应中获取每个用户的角色? 或者也许有更好的方法?

谢谢。

【问题讨论】:

    标签: javascript node.js express sequelize.js


    【解决方案1】:

    你需要打电话

    models.User.findAll({offset: offset, limit: limit, include: [models.Role]})
    

    查看http://sequelizejs.com/documentation#models-eager-loading了解更多详情

    【讨论】:

      【解决方案2】:

      未获取关联角色的原因是,获取该用户的角色是异步处理的。这意味着 1.) 您需要使用 user.getRole().success(function(role){}) 和 2.) 您需要读取控制器中的角色,因为 EJS 无法处理异步性。希望有帮助:)

      【讨论】:

      • 那么,要创建一个包含 20 个用户及其角色的列表,我们是否必须执行 20 个额外请求才能获得相关角色?但是在纯 sql 中,我们可以在一个查询中做到这一点。
      • 现在就是这样。您还可以尝试使用 sequelize.query 方法,该方法执行 sql 查询并将内容作为对象返回。然而,这更像是一种黑客攻击,而不是其他任何东西。这就是它的工作方式:sequelize.query("SELECT * FROM users, roles WHERE users.id = roles.user_id", null, {raw: true})
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2011-08-20
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多