【问题标题】:how to merge response attributes of other table in node js如何在节点js中合并其他表的响应属性
【发布时间】:2019-07-13 00:24:20
【问题描述】:

我有 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"
    }
]

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您可以在获取属性时使用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)
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2019-09-11
      • 2017-09-24
      相关资源
      最近更新 更多