使用sequelize进行一对多关联查询时不想让关系表名设置为复数的解决办法

背景

  1. 使用的是egg-sequelize
  2. 早就全局设置了freezeTableName: true,正常查询不会修改查询的表名
  3. 多对一查询时也没有修改表名为复数

出错的SQL:
SELECT group.id, user.id AS id, user.name AS name, user.avatar AS avatar FROM group AS group LEFT OUTER JOIN ‘user’ AS ‘users’ ON group.id = users.group_id ;
注意加粗部分?

原因

Sequelize中文文档 检索关键词:命名策略
当我们使用多对一查询的时候,因为是多对一,sequelize认为我们每一条数据只对应一个关联数据,所以会使用单数的表名进行查询。
而当我们使用一对多或多对多的时候,Sequelize认为我们一条数据的关联数据是多个,所以会将表名指定为复数,返回的数据也是复数形式。

解决办法

像文档里那样,自己指定单复数形式。
或者在设置关联的时候,指定as属性:

app.model.Group.hasMany(app.model.User, { as: 'members', foreignKey: 'groupId' });

在查询的时候也需要指定as【必须】

const result: any = await ctx.model.Group.findOne({
      include: {
        attributes: [ 'id', 'name', 'avatar' ],
        model: ctx.model.User,
        as: 'members',
      },
      where: {
        id: groupId,
      },
    });

当查询Group,关联User的时候,user会以members的名称返回。
在这里插入图片描述
但是需要注意,默认添加到实例上的也不再是getUsers,addUsers,等,而是getMembers, addMembers…

所以如果不是特别需要,就别改了。。


版权声明:本文为LimonSea原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。