续集关联On或ON

时间:2018-02-22 23:41:08

标签: jquery mysql node.js sequelize.js

Dears我有模型订单与OrderHasWarranty模型

的关联

所以OrderHasWarranty有2个外键,我需要Sequelize检查这些外键的include(不使用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 个答案:

答案 0 :(得分:0)

我认为你不能得到你想要的东西,但我很确定做出以下改变可以为你产生预期的结果:

为关系添加别名(您可以选择更合适的一些)

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将添加到目标上的源上添加foreignKey。

因此,通过添加belongsTo关联,如下所示:

OrderHasWarranty.belongsTo(models.Order, {as: "warranty1", foreignKey:"orderId"});
OrderHasWarranty.belongsTo(models.Order, {as: "warranty2", foreignKey:"warrantyFromOrderId"});

你的错误应该得到解决。