背景
- 使用的是egg-sequelize
- 早就全局設置了
freezeTableName: true
,正常查詢不會修改查詢的表名 - 多對一查詢時也沒有修改表名爲複數
出錯的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…