续集关联 On 或 ON
Posted
技术标签:
【中文标题】续集关联 On 或 ON【英文标题】:sequelize association On or ON 【发布时间】:2018-08-02 23:44:16 【问题描述】:亲爱的,我的模型订单与 OrderHasWarranty 模型有关联
所以 OrderHasWarranty 有 2 个外键,我需要 Sequelize 来检查这两个外键的包含(不使用 where 条件)
所以我在订单模型中使用了以下关联
Order.hasOne(models.OrderHasWarranty,foreignKey:"orderId");
Order.hasOne(models.OrderHasWarranty,foreignKey:"warrantyFromOrderId");
原始查询给我:
LEFT OUTER JOIN `order_has_warranties` AS `OrderHasWarranty`
ON `Order`.`id` = `OrderHasWarranty`.`warrantyFromOrderId`
WHERE `Order`.`id` = '25459';
基本上我需要的是使用关联转换下面的查询
LEFT OUTER JOIN `order_has_warranties`
AS `OrderHasWarranty` ON `Order`.`id` = `OrderHasWarranty`.`warrantyFromOrderId`
OR `Order`.`id` = `OrderHasWarranty`.`orderId` WHERE `Order`.`id` = '25459';
所以我需要在关联中使用 OR 条件,我尝试使用 hasMany 但没有运气
谢谢
【问题讨论】:
【参考方案1】:我认为您无法获得所需的确切内容,但我很确定进行以下更改可能会为您带来所需的结果:
为关系添加别名(您可以选择更合适的)
Order.hasOne(models.OrderHasWarranty,as: "warranty1", foreignKey:"orderId");
Order.hasOne(models.OrderHasWarranty,as: "warranty2", foreignKey:"warrantyFromOrderId");
然后,您可以将它们都包含在搜索中,如下所示:
Order.find(
where:
id: 25459
,
include: ['warranty1', 'warranty2']
).then(...).catch(...);
这会产生这样的结果:
LEFT OUTER JOIN `order_has_warranties` AS `warranty1`
ON `Order`.`id` = `OrderHasWarranty`.`orderId`
LEFT OUTER JOIN `order_has_warranties` AS `warranty2`
ON `Order`.`id` = `OrderHasWarranty`.`warrantyFromOrderId`
WHERE `Order`.`id` = '25459'
编辑:
您报告的错误可能是由使用hasOne
方法声明关联引起的。 Sequelize Doc 说:
尽管它被称为 HasOne 关联,但对于大多数 1:1 关系,您通常需要 BelongsTo 关联,因为 BelongsTo 将在源上添加外键,而 hasOne 将在目标上添加。
因此,还可以添加 belongsTo
关联,如下所示:
OrderHasWarranty.belongsTo(models.Order, as: "warranty1", foreignKey:"orderId");
OrderHasWarranty.belongsTo(models.Order, as: "warranty2", foreignKey:"warrantyFromOrderId");
您的错误应该得到解决。
【讨论】:
谢谢亲爱的,所以我根据你的评论做了以下更改 Order.hasOne(models.OrderHasWarranty,as: "parentOrder", foreignKey:"orderId"); Order.hasOne(models.OrderHasWarranty,as: "childOrder", foreignKey:"warrantyFromOrderId");现在收到此错误 OrderHasWarranty (orderId) 与 Order 没有关联! 这是我的包含:["parentOrder","childOrder"] 所以我收到了一个新错误,包含意外。元素必须是模型、关联或对象。 奇怪,文档报告说“您还可以通过指定与关联别名匹配的字符串来按别名包含”。您使用的是哪个版本的 Sequelize? (Sequelize [Node: 6.9.1, CLI: 2.4.0, ORM: 3.30.4]) CLI 版本 3.9.1以上是关于续集关联 On 或 ON的主要内容,如果未能解决你的问题,请参考以下文章