javascript - 多表关联为何sequelize 的 attributes不生效?
伊谢尔伦
伊谢尔伦 2017-04-11 12:34:33
[JavaScript讨论组]

有 user表,role表,然后user和role建立了多对多的关系
代码是这样的

let user = await models.User.findOne({
    where: {id: id},
    attributes: ['name','id']
});
let roles = await user.getRoles({
    attributes: ['name','id'],
    raw: true
});

user和role数据都是能取到的,user 的 attributes也是生效的,
但是roles 的就不行了,role表本身的字段能过滤,但是不知道为什么一定会带上user与role 的关系数据

大概就是我想要的是这样的数据

{ 
    id: 1,
    name: '管理员'
}

却给了我这样的数据

{ 
    id: 1,
    name: '管理员',
    'userRole.createdAt': 2016-09-02T09:43:07.714Z,
    'userRole.updatedAt': 2016-09-02T09:43:07.714Z,
    'userRole.userId': 1,
    'userRole.roleId': 1 
}

看文档也没找到解决的办法
http://docs.sequelizejs.com/e...

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
巴扎黑

这个我帮不了你,后端我主要用 C#,对 NodeJS 不熟

怪我咯

查看一下最终的SQL语句,应该是使用的inner join,所以需要取消inner join。官方文档http://docs.sequelizejs.com/en/latest/api/model/:

Where clauses to apply to the child models. Note that this converts the eager load to an inner join, unless you explicitly set required: false

参考:

  • 求解sequelize mysql怎么实现以下查询?

PHP中文网

我用的是type, 替换了你role里面的name,你的问题是因为user.getRoles最终会转变成为

 SELECT `role`.`type`, `role`.`id`, `userrole`.`id` AS `userrole.id`, `userrole`.`userId` AS `userrole.userId`, `userrole`.`roleId` AS `userrole.roleId`, `userrole`.`createdAt` AS `userrole.createdAt`, `userrole`.`updatedAt` AS `userrole.updatedAt` FROM `roles` AS `role` INNER JOIN `userroles` AS `userrole` ON `role`.`id` = `userrole`.`roleId` AND `userrole`.`userId` = 1;

你写的attribute只能控制role表的输出,不能控制userRole表的输出,这是sequelize的一个问题,但是你可以绕过去, 如下

let roleInstances = await user.getRoles({
    attributes: ['type','id']
});

const roles = roleInstances.map(role => ({ type: role.get('type'), id: role.get('id') }))

// roles = [ { type: 'admin', id: 1 } ]

就可以拿到你想要的结果了,希望对你有帮助

PHP中文网

你啥也不交待,你数据库用的啥?你用的什么组件来连数据库?都说说,还有getRoles这是个啥?

每个数据库每个组件的操作方法各有区别

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号