续集关联 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的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 在关联调用中使用变量

Ruby on Rails:用户模型关联应用程序和迁移

on_delete的相关使用说明

如何通过关联查询续集模型,但包括所有关联对象?

ruby on rails (模型关联查询)

续集限制包括关联