【问题标题】:How can I write findAll in sequelize我如何在sequelize中写findAll
【发布时间】:2020-05-10 00:34:12
【问题描述】:

我有 2 个模型。
表格 zen 显示用户的所有交易。
用户可以向其他用户汇款。
我想把昵称加入禅桌。

zen.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const zen = sequelize.define('zen', {
    from_user_id: DataTypes.BIGINT,
    to_user_id: DataTypes.BIGINT,
    zen_price: DataTypes.INTEGER,
  }, {
    underscored: true,
  });
  zen.associate = function(models) {
    // associations can be defined here
  };
  return zen;
};
+--------------+------------+-----------+
| from_user_id | to_user_id |     price |
+--------------+------------+-----------+
|            1 |          2 |       200 |
|            1 |          3 |       200 |
|            1 |          4 |       200 |
|            1 |          5 |       200 |
|            2 |          1 |       200 |
|            2 |          3 |       200 |
|            2 |          4 |       200 |
|            2 |          5 |       200 |
|            3 |          1 |       200 |
|            3 |          2 |       200 |
|            3 |          4 |       200 |
|            3 |          5 |       200 |
|            4 |          1 |       200 |
|            4 |          2 |       200 |
|            4 |          3 |       200 |
|            4 |          5 |       200 |
|            5 |          1 |       200 |
|            5 |          2 |       200 |
|            5 |          3 |       200 |
|            5 |          4 |       200 |
+--------------+------------+-----------+

user.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('user', {
    nickname: DataTypes.STRING,
  }, {
    underscored: true,
    paranoid: true
  });
  user.associate = function(models) {
    // associations can be defined here
  };
  return user;
};
+----+----------+
| id | nickname |
+----+----------+
|  1 | umi      |
|  2 | minato   |
|  3 | haruto   |
|  4 | rikuto   |
|  5 | yamato   |
+----+----------+

我写过这样的sql

select g.from_user_id, t1.nickname, g.to_user_id, t2.nickname from zens g inner join users t1 on g.from_user_id = t1.id inner join users t2 on g.to_user_id = t2.id;

结果是

mysql> select g.from_user_id, t1.nickname, g.to_user_id, t2.nickname from zens g inner join users t1 on g.from_user_id = t1.id inner join users t2 on g.to_user_id = t2.id;
+--------------+----------+------------+----------+
| from_user_id | nickname | to_user_id | nickname |
+--------------+----------+------------+----------+
|            1 | umi      |          2 | minato   |
|            1 | umi      |          3 | haruto   |
|            1 | umi      |          4 | rikuto   |
|            1 | umi      |          5 | yamato   |
|            2 | minato   |          1 | umi      |
|            2 | minato   |          3 | haruto   |
|            2 | minato   |          4 | rikuto   |
|            2 | minato   |          5 | yamato   |
|            3 | haruto   |          1 | umi      |
|            3 | haruto   |          2 | minato   |
|            3 | haruto   |          4 | rikuto   |
|            3 | haruto   |          5 | yamato   |
|            4 | rikuto   |          1 | umi      |
|            4 | rikuto   |          2 | minato   |
|            4 | rikuto   |          3 | haruto   |
|            4 | rikuto   |          5 | yamato   |
|            5 | yamato   |          1 | umi      |
|            5 | yamato   |          2 | minato   |
|            5 | yamato   |          3 | haruto   |
|            5 | yamato   |          4 | rikuto   |
+--------------+----------+------------+----------+
20 rows in set (0.00 sec)

如何编写关联并包含在函数 findAll 中

exports.findAll = (req, res) => {
  console.log('**** findAll ****')

  Zens.findAll({
  })
  .then(data => {
    res.send(data);
  })
  .catch(err => {
    res.status(500).send({
      message:
        err.message || "Some error occurred while retrieving tutorials."
    });
  });

}

提前感谢您。

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:
    1. 您应该添加到从 zen 到具有不同别名的用户的关联(这样,您可以将它们彼此区分开来)。
    zen.associate = function(models) {
        zen.belongsTo(models.user, { foreignKey: 'from_user_id', as: 'FromUser' })
        zen.belongsTo(models.user, { foreignKey: 'to_user_id', as: 'ToUser' })
    };
    
    1. 在 findAll 中使用上述关联指示 include 选项:
    Zens.findAll({
         include: [{
           model: db.user,
           as: 'FromUser'
         }, {
           model: db.user,
           as: 'ToUser'
         }]
      })
    

    这样您将获得带有两个对象道具 FromUser 和 ToUser 的 zen 对象。

    如果您希望从关联模型中获取特定字段,您可以在每个包含的模型中指定 属性 选项:

    Zens.findAll({
         attributes: ['zen_price'],
         include: [{
           model: db.user,
           as: 'FromUser',
           attributes: ['nickname']
         }, {
           model: db.user,
           as: 'ToUser',
           attributes: ['nickname']
         }]
      })
    

    【讨论】:

    • 有效!对我来说就像一个魅力!非常感谢阿纳托利!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2020-04-08
    • 2017-04-24
    • 2020-05-13
    • 2019-11-17
    • 2021-03-21
    相关资源
    最近更新 更多