如何在 Sequelize Postgresql 中执行多个内连接

Kan*_*n T 3 postgresql join node.js sequelize.js

我是 RDBMS 和 Sequelize 的新手,也想在现在对 JOINS 感兴趣的领域进行更多探索。我不知道如何通过 SEQUELIZE 执行 JOINS。我有 3 个表 USERS、ORDERS、PRODUCTS ORDERS 表包含 USERS、ProductS 主键作为其外键。我在用户模型下面附上了我的模型代码

const Sequelize = require('sequelize');
const sequelize = require('../config');
let Users = sequelize.define('users', {
  id : {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  username: {
    type: Sequelize.STRING,
  },
  password: {
    type: Sequelize.STRING
  }
});
module.exports = Users;
Run Code Online (Sandbox Code Playgroud)

产品型号

const Sequelize = require('sequelize');
const sequelize = require('../config');
let products=sequelize.define('products', {
  id : {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  category : {
    type: Sequelize.STRING,
    allowNull: false
  },
  name : {
    type: Sequelize.STRING,
    allowNull: false
  },
  price: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
});
module.exports= products;
Run Code Online (Sandbox Code Playgroud)

订单模型

const Sequelize = require('sequelize');
const sequelize = require('../config');
let users=require('./user');
let products=require('./product');
let orders=sequelize.define('orders', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  user_id: {
    type: Sequelize.INTEGER,
    references: {
        model: 'users',
        key: 'id'
    }
  },
  product_id: {
    type: Sequelize.INTEGER,
    references: {
        model: 'products',
        key: 'id'
    }
  },
  price: {
    type: Sequelize.INTEGER,
    allowNull: false
  }
});
module.exports= orders;
Run Code Online (Sandbox Code Playgroud)

我希望通过 SEQUELIZE 执行以下原始查询

SELECT * FROM ((orders INNER JOIN users ON users.id=orders.user_id) INNER JOIN products ON products.id=orders.product_id);
Run Code Online (Sandbox Code Playgroud)

我查看了文档,但不知道该怎么做。任何帮助表示赞赏。谢谢

小智 5

您需要做的第一件事是建立您的协会

那么让我们把它分成几个部分。我们知道您的 ORDERS 表包含 USER 和 Product 的 id。这就是您为这些表设置关联的方式。

  1. 我假设用户有很多订单。我们在两个方向上进行关联。

    User.hasMany(订单, {foreignKey: 'user_id'}); Order.belongsTo(User, {foreignKey: 'user_id'});

您似乎已正确定义模型。

  1. 现在为了进行联接,在设置关联之后,我们要设置一个查询来对表进行联接。现在请记住,这将在您的控制器中完成。

// 确保您在此处导入模型以便在下面使用

export function getRequestsByWeek(req, res) {
  return order.findAll({
    include: [
      {model: users, attributes: []}, // nothing in attributes here in order to not import columns from users
      {model: products} // nothing in attributes here in order to not import columns from products
    ],
    attributes: ['id'], //in quotes specify what columns you want, otherwise you will pull them all
    // Otherwise remove attributes above this line to import everything. 
  })
    .then(respondWithResult(res))
    .catch(handleError(res));
}
Run Code Online (Sandbox Code Playgroud)