mysql - Sequelize 在查询中包含多个表

标签 mysql orm sequelize.js associations feathers-sequelize

所以我有以下结构收据 -> 政策 -> 保单持有人
每张收据都属于一份保单,每份保单都属于一个保单持有人
我想要做的是,当我取回收据时,我得到一个包含保单和保单持有人的对象(我使用的是羽毛 Sequelize ,钩子(Hook)包含在下面)。我收到投保人与收据无关的错误
期望的回应:

{
    "ReceiptId": 1,
    "Supplement": 10.1,
    "policy": {
        "PolicyNumber": 1234
    },
    "policyholder": {
        "Name": "Joe",
        "Surname": "Blogs"
    }
}
政策模型
// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.
const Sequelize = require("sequelize");
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get("sequelizeClient");

  const policies = sequelizeClient.define(
    "policies",
    {
      PolicyId: {
        autoIncrement: true,
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true,
      },
      PolicyNumber: {
        type: DataTypes.STRING(30),
        allowNull: true,
      },
      CompanyId: {
        type: DataTypes.INTEGER,
        allowNull: true,
      },
      PolicyholderId: {
        type: DataTypes.INTEGER,
        allowNull: true,
      },
    },
    {
      hooks: {
        beforeCount(options) {
          options.raw = true;
        },
      },
    }
  );

  // eslint-disable-next-line no-unused-vars
  policies.associate = function (models) {
    // Define associations here
    // See http://docs.sequelizejs.com/en/latest/docs/associations/
    const { policyholders, companies } = models;
    policies.belongsTo(policyholders, { foreignKey: "PolicyholderId" });

  };

  return policies;
};
投保人模式
// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.
const Sequelize = require("sequelize");
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get("sequelizeClient");
  const policyholders = sequelizeClient.define(
    "policyholders",
    {
      PolicyholderId: {
        autoIncrement: true,
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true,
      },
      Name: {
        type: DataTypes.STRING(250),
        allowNull: true,
      },
      Surname: {
        type: DataTypes.STRING(250),
        allowNull: true,
      },
    },
    {
      hooks: {
        beforeCount(options) {
          options.raw = true;
        },
      },
    }
  );

  // eslint-disable-next-line no-unused-vars
  policyholders.associate = function (models) {
    // Define associations here
    // See http://docs.sequelizejs.com/en/latest/docs/associations/
    const { policies } = models;

    policyholders.hasMany(policies, { foreignKey: "PolicyholderId" });
  };

  return policyholders;
};
收据模型
// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.
const Sequelize = require("sequelize");
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get("sequelizeClient");
  const receipts = sequelizeClient.define(
    "receipts",
    {
      ReceiptId: {
        autoIncrement: true,
        type: DataTypes.INTEGER,
        allowNull: false,
        primaryKey: true,
      },
      PolicyId: {
        type: DataTypes.INTEGER,
        allowNull: true,
      },
      Supplement: {
        type: DataTypes.INTEGER,
        allowNull: true,
      },
    },
    {
      hooks: {
        beforeCount(options) {
          options.raw = true;
        },
      },
    }
  );

  // eslint-disable-next-line no-unused-vars
  receipts.associate = function (models) {
    // Define associations here
    // See http://docs.sequelizejs.com/en/latest/docs/associations/
    const { policies } = models;
    receipts.belongsTo(policies, { foreignKey: "PolicyId" });

  };

  return receipts;
};
获取相关钩子(Hook)
module.exports = function (options = {}) {
  return async (context) => {
    const { include, ...query } = context.params.query;

    const Policies = context.app.services.policies.Model;
    const Policyholders = context.app.services.policyholders.Model;

    context.params.sequelize = {
      include: [Policies, Policyholders],
      raw: false,
    };

    // Update the query to not include `include`
    context.params.query = query;

    return context;
  };
};

最佳答案

如果 Placeholders链接到 Receipts通过Policies那么你需要注明Placeholdersinclude Policies 的选项本身:

 context.params.sequelize = {
      include: [{
        model: Policies,
        include: [Policyholders]
      }],
      raw: false,
    };

关于mysql - Sequelize 在查询中包含多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67250760/

相关文章:

node.js - Sequelize - 在验证模型关联时获得正确的路径

php - 使用 PDO 时为 "Notice: Undefined variable: db"

orm - 领域模型如何与 UI 和数据交互而不依赖于它们?

java - Hibernate 映射到自引用、多对多映射

javascript - 模仿 [colA] 和 [colB] 之间的 [condition] Sequelize

javascript - "migration:create"和 "migration:generate"之间有什么区别?

php - 如何获取同一个表中两列的值

mysql - SQL DELETE with JOIN another table for WHERE 条件

php - 如何将.doc文件内容插入mysql表

mysql - 使用 ORM Doctrine 过滤数据库上的所有查询