Sequelize-typescript 父表查询子表属性报字段不存在错误排查
问题原因
你当前的roleClause是上层主查询的嵌套关联项,而非查询的主模型,当你在roleClause.attributes中直接写sequelize.col("appfunction.name")时,Sequelize 会从主查询的根路径开始解析字段路径,而非从当前Role关联的层级开始解析,因此会把appfunction.name整体当做字段名,拼到Role自动生成的表别名role->roles后面,最终生成非法的SQL字段role->roles.appfunction.name。
解决方案
你可以任选以下一种方式修复:
- 方法1:使用Sequelize内置的嵌套关联字段引用语法,用
$包裹完整的关联路径(路径从上层include的Role别名开始拼接,此处根据你生成的SQL别名,Role的上层别名为roles):
// 替换原来的sequelize.col写法 attributes: ['canRead', 'canWrite', 'canDelete', [sequelize.col("$roles.appfunction.name$"), "name"]],
- 方法2:直接用
sequelize.literal写死符合你预期的正确字段,适配当前的自动生成别名规则:
attributes: ['canRead', 'canWrite', 'canDelete', [sequelize.literal("`role->roles->appfunction`.`name`"), "name"]],
- 方法3:如果不想依赖自动生成的别名,可以显式给Role关联Appfunctions的语句配置
as参数,引用的时候用你自定义的别名即可,示例关联定义如下:
// Role模型里的关联定义 @BelongsTo(() => Appfunctions, { as: "appFunc", foreignKey: "appFuncId" }) appFunc: Appfunctions; // 引用的时候写自定义的别名路径 attributes: ['canRead', 'canWrite', 'canDelete', [sequelize.col("$roles.appFunc.name$"), "name"]],
内容的提问来源于stack exchange,提问作者Devb
相关产品推荐
相关产品推荐

