node.js - 如何合并 Node js中其他表的响应属性

标签 node.js sequelize.js

我有 3 个表 User、Cars 和 UserCars

User{id, name, phone, email}
Cars{id, name, manufacturer}
UserCars{id, car_id, user_id, role}

User have many cars(through UserCars)
Cars have many users(through UserCars)

我正在使用 express js


    router.get('/', async (req, res) => {

        try {

            let car = await Car.findOne({
                where: {
                id: req.car_id
            }});

            let users = await car.getUsers({joinTableAttributes: ['role']})
            res.send(users)

        } catch (e) {
            console.log(e)
            res.status(400).send(e)
        }

    })

这是我的回应

[
    {
        "id": 1,
        "name": "test",
        "email": null,
        "phone": null,
        "createdAt": "2019-07-09T09:38:11.859Z",
        "updatedAt": "2019-07-12T04:34:20.922Z",
        "User_car": {
            "role": "driver"
        }
    }
]

但是知道如何在用户对象中包含角色,而不是在 User_car 表中单独指定它, 有没有办法让我得到下面的输出


[
    {
        "id": 1,
        "name": "test",
        "email": null,
        "phone": null,
        "role": 'driver'
        "createdAt": "2019-07-09T09:38:11.859Z",
        "updatedAt": "2019-07-12T04:34:20.922Z"
    }
]

最佳答案

您可以在获取属性时使用 sequelize.literal 来获取该字段。

attributtes: [
  // define your other fields
  [sequelize.literal('`users->User_car`.`role`'), 'role'],
]

现在,我不确定这是否适用于 car.getUsers。我通常使用 include 进行单个查询并定义“join”表,这样我就可以知道在 sequelize 上它是如何命名的。让我举个例子。

module.exports = (sequelize, DataTypes) => {
  const UserCar = sequelize.define('UserCar', {
    // id you don't need and id field because this is a N:M relation
    role: {
      type: DataTypes.STRING
    },
    carId: {
      field: 'car_id',
      type: DataTypes.INTEGER
    },
    userId: {
      field: 'user_id',
      type: DataTypes.INTEGER
},
  }, {
    tableName: 'User_car',
    underscored: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
  });

  UserCar.associate = (models) => {
    models.user.belongsToMany(models.car, { as: 'cars', through: User_car, foreignKey: 'user_id' });
    models.car.belongsToMany(models.user, { as: 'users',    through: User_car, foreignKey: 'car_id' });
  };

  return UserCar;
};

router.get('/', async (req, res) => {

  try {
    const users = await User.findAll({ 
      include: [{
        model: Car,
        as: 'cars',
        where: { id: req.car_id }
      }],
      attributtes: [
        'id',
        'name',
        'email',
        'phone',
        [sequelize.literal('`cars->User_car`.`role`'), 'role'],
      ]
    })
    res.send(users)

  } catch (e) {
    console.log(e)
    res.status(400).send(e)
  }
});

关于node.js - 如何合并 Node js中其他表的响应属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57001995/

相关文章:

node.js - Sequelize 多对多关联 : getter/setter methods do not exist

javascript - 如何使用间接关联进行过滤

node.js - NodeJs : Sequelize (Version - 5+) N:M association is not working

javascript - 编译Coffeescript时不要添加var

javascript - Sequelize findOne 最新条目

javascript - Sequelize 自定义验证 - 无法访问实体中的所有字段

node.js - Sequelize - 计算关联并从与查询的关联中获取数据

javascript - Node JS 和 C# 中的 AES 加密给出了不同的结果

git - 如何防止不需要的钩子(Hook)请求?

node.js - Azure AD - 仅应用程序 token 中缺少角色声明