Sequelize是否需要在模型关联和查询中同时指定as参数?
Sequelize关联as属性重复配置问题解答
为什么定义关联时指定了as,查询时还要重复传入
同一个模型可以和另一个目标模型建立多个独立关联,比如client模型可能同时关联organization作为「认证主体」和「付费主体」,两个关联共用同一张表但业务含义完全不同,as属性是Sequelize用来区分多关联场景的唯一标识。如果默认用定义时的as作为查询默认值,多关联场景下反而会出现默认指向不明确的问题,这是该设计的核心逻辑。
避免重复硬编码as的方案
方案1:抽离公共常量统一管理
把所有关联别名定义为全局常量,定义关联和查询时都引用同一个常量,避免多处硬编码:
// 全局常量定义 const ASSOCIATION_ALIASES = { CLIENT_AUTH_ORG: 'AuthOrganization', ORG_CLIENTS: 'Clients' } // 关联定义时引用 organization.hasMany(client, { as: ASSOCIATION_ALIASES.ORG_CLIENTS, foreignKey: "organization_id" }); client.belongsTo(organization, { as: ASSOCIATION_ALIASES.CLIENT_AUTH_ORG, foreignKey: "organization_id" }); // 查询时直接引用常量即可 let data = await client.findOne({ include: [{ model: organization, as: ASSOCIATION_ALIASES.CLIENT_AUTH_ORG }] }, { raw: true });
方案2:直接引用模型的关联实例查询
关联定义完成后,Sequelize会把所有关联挂载到模型的associations属性下,查询时直接传入对应关联实例即可,无需重复写model和as:
let data = await client.findOne({ include: [client.associations.AuthOrganization] }, { raw: true });
不需要写as也能修改mixin函数名的方法
你最初加as只是为了避免mixin函数名下划线,完全可以通过关联的name配置项实现,不需要加as,同时可以实现你理想中的查询写法:
// 关联定义不用加as,通过name指定驼峰命名 client.belongsTo(organization, { foreignKey: "organization_id", // 自定义单复数命名,mixin函数会直接用这里的命名生成,不会有下划线 name: { singular: 'AuthOrganization', plural: 'AuthOrganizations' } }); // 查询时直接传入模型即可,不需要as let data = await client.findOne({ include: organization }, { raw: true });
内容的提问来源于stack exchange,提问作者Tsar Bomba
相关产品推荐
相关产品推荐

