使用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…

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章