是否可以在没有定义关系的情况下加入Sequelize中的表?

时间:2017-11-27 23:42:59

标签: node.js express sequelize.js

我的研究表明没有。这是我想做的一个简单示例。

给出3个表:公司,产品,查找......

公司有很多产品。产品有一家公司。查找表用作硬编码值的枚举/常量。即州/国家名称,特定于应用程序的命名约定等。

以下是sequelize-typescript中的模型(尽管这个问题仍然与sequ​​elize 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 任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

是的,这是可能的,因为Sequelize接受sequelize.query()形式的文字续集查询。你可以完全绕过include []语法(我还没有测试过这个,但这是我的理解)。只需在sequelize.query()中放入一个带有JOIN语句的原始SQL查询。

http://docs.sequelizejs.com/manual/tutorial/raw-queries.html