Sequelize 从 belongsTo 关系中获取值

Posted

技术标签:

【中文标题】Sequelize 从 belongsTo 关系中获取值【英文标题】:Sequelize get values from belongsTo relationship 【发布时间】:2017-06-08 13:30:24 【问题描述】:

我正在使用 mysql 中的现有数据库创建应用程序。 我可以从表中检索值,但是当我尝试从关联模型中检索值时,不起作用。

采购订单模型:

"use strict";

module.exports = (sequelize, DataTypes) => 
  var PurchaseOrder = sequelize.define('purchase_orders' , 
    id: 
    type: DataTypes.INTEGER(11),
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
    field: 'id'
  ,
  purchaseDate: 
    type: DataTypes.DATE,
    allowNull: true,
    field: 'purchase_date'
  ,
  supplierId: 
    type: DataTypes.INTEGER(11),
    allowNull: true,
  //  references: 
//      model: 'suppliers',
//      key: 'id'
//    ,
    field: 'supplier_id'
  ,
  requestedById: 
    type: DataTypes.INTEGER(11),
    allowNull: true,
    field: 'requested_by_id'
  ,
  masterPurchaseOrderId: 
    type: DataTypes.INTEGER(11),
    allowNull: true,
//    references: 
//      model: 'master_purchase_orders',
//      key: 'id'
//    ,
    field: 'master_purchase_order_id'
  ,
  createdAt: 
    type: DataTypes.DATE,
    allowNull: false,
    field: 'created_at'
  ,
  updatedAt: 
    type: DataTypes.DATE,
    allowNull: false,
    field: 'updated_at'
  
 ,
  classMethods:
    associate: (models) => 
      PurchaseOrder.belongsTo(models.masterPurchaseOrders,
        foreignkey: 'master_purchase_order_id'
      );
    ,
    associate: (models) => 
      PurchaseOrder.belongsTo(models.supplier,
        foreignkey: 'supplier_id'
      );
    ,
  ,
, 
    timestamps: true,
    paranoid: false,
    underscored: true,
    freezeTableName: true,
    tableName: 'purchase_orders'
  );

  return PurchaseOrder;

采购订单控制器:

"using strict";
const purchaseOrder = require('../models/').purchase_orders;
const Supplier = require('../models/').supplier;
const Master = require('../models/').masterPurchaseOrders;

module.exports= 
  index(req, res) 
    purchaseOrder
      .findAll(
        include:[Supplier, Master]
      )
      .then((masters) => 
        res.status(200).json(masters);
      )
      .catch((error) => 
        res.status(500).json(error);
      );
  ,
  create(req, res) 
    purchaseOrder
      .create(req.body)
      .then( master => 
        res.status(200).json(master);
      )
      .catch( error => 
        res.status(500).json(error);
      );
  ,
;

如果我只在函数 findall() 中包含模型供应商。我从采购中获取数据,从供应商处获取数据。 但是当我包括模型主采购订单时。我得到一个空的 json。

【问题讨论】:

【参考方案1】:

你能做到以下几点

purchaseOrder
      .findAll(
        include:[model: Supplier, required:true, model: Master, required : false]
      )

【讨论】:

【参考方案2】:

这是因为你覆盖了classMethodsassociate 属性,只会执行第二个associate() 函数。

您应该将两个关联定义移到一个函数中:

classMethods:
    associate: (models) => 
        PurchaseOrder.belongsTo(models.masterPurchaseOrders,
            foreignkey: 'master_purchase_order_id'
        );
        PurchaseOrder.belongsTo(models.supplier,
            foreignkey: 'supplier_id'
        );
    ,
,

【讨论】:

您能告诉我如何获取具有子关系的对象吗?因为我正在使用具有 hasMany 关系但仅重试父表的单个对象并且没有得到任何关系的父模型的 findOne 方法。

以上是关于Sequelize 从 belongsTo 关系中获取值的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize ORM中HasOne和BelongsTo的区别

Sequelize hasMany工作正常,但反比关系不正常

Sequelize.hasMany/belongsTo中的foreignKey是啥意思?

Apollo,Sequelize - 简单的 `belongsTo` 关联返回 null

sequelizejs 关系/关联,hasMany/belongsTo vs 定义模型上的参考

如何在 Sequelize 中使用 LEFT JOIN?