【问题标题】:sequelize association On or ON续集关联 On 或 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 但没有运气

谢谢

【问题讨论】:

    标签: jquery mysql node.js sequelize.js


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多