我的研究表明没有。这是我想做的一个简单示例。
给出3个表:公司,产品,查找......
公司有很多产品。产品有一家公司。查找表用作硬编码值的枚举/常量。即州/国家名称,特定于应用程序的命名约定等。
以下是sequelize-typescript中的模型(尽管这个问题仍然与sequelize js完全相关):
// COMPANY
@Table
export default class Company extends Model<Company> {
@PrimaryKey
@Column
Oid:number;
@Column
Name:string;
@Column
Address:string;
@HasMany(() => Product)
products: Product[];
}
// PRODUCT
@Table
export default class Product extends Model<Product>{
@PrimaryKey
@Column
Oid: number;
@ForeignKey(() => Company)
@Column
companyOid: number;
@BelongsTo(() => Company)
company: Company;
@Column
Price: number;
@Column
Name: string;
//@ForeignKey(() => Lookup) //attempt #1
//@Column({references: {model: "Lookup", key: "Oid"}}) //attempt #2
@Column
LkpStateOid: number;
}
// LOOKUP
@Table
export default class Lookup extends Model<Lookup> {
@PrimaryKey
//@BelongsTo(() => Product) // do not want to hardcode Product, as it could be any table
@Column
Oid:number;
@Column
Value:number; // where the value represents the hardcoded state, county, etc., ie "CA"
}
这里的问题是没有真正的&#34; Product.lkpStateOid和Lookup.oid之间的关系,除了引用另一个以获取Lookup.value
之外。在任何sql变体中,这不是问题 - 只是表上的简单连接。但是,在sequelize中,在我可以获取查询中的任何关联数据之前,必须知道表之间的关系。这就是我想做的事情:
const companyInfo = await Db.Company.find({
include: [{
model: Product,
include: [{
model: Lookup,
attributes: ["value"]
}]
}]
})
第一个include
没问题。第二个嵌套include
不成功。我已经在桌面上尝试了许多不同的注释,但是第二个问题(即使我可以成功&#34;假的&#34;关系以便能够关联数据)是我不想要对查找表belongsTo
中的哪个表进行硬编码,因为查找表可能包含任意数量的其他表所需的值。有没有办法实现这个目标?
此链接似乎与我喜欢的内容相近(并在上表中被评为一个想法):http://docs.sequelizejs.com/manual/tutorial/associations.html#enforcing-a-foreign-key-reference-without-constraints 任何帮助,将不胜感激。谢谢!
答案 0 :(得分:0)
是的,这是可能的,因为Sequelize接受sequelize.query()形式的文字续集查询。你可以完全绕过include []语法(我还没有测试过这个,但这是我的理解)。只需在sequelize.query()中放入一个带有JOIN语句的原始SQL查询。
http://docs.sequelizejs.com/manual/tutorial/raw-queries.html