포함 모델에 속편화 기능 속성을 추가하는 방법은 무엇입니까?

3906 단어
잘 지내고 있나요. 백엔드에서 Sequelize를 사용하고 있는데 기본적인 문제에 직면했습니다.

친구 모델

const Friend = sequelize.define('Friend', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        user_id: {
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        invite_user_id: DataTypes.INTEGER,
        status: DataTypes.TINYINT  //0: send invite, 1: accepted, 2: refuse, 3: cancel
    },{
        paranoid: true,
    });
    Friend.associate = function (models) {
        this.hasOne(models.Users, {
            foreignKey: 'id',
            as: 'incoming_user',
            sourceKey: 'user_id'
        });
        this.hasOne(models.Users, {
            foreignKey: 'id',
            as: 'invite_user',
            sourceKey: 'invite_user_id'
        });
    };


사용자 모델

const Users = sequelize.define('Users', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    user_id: DataTypes.STRING,
    user_name: DataTypes.STRING,
    nick_name: DataTypes.STRING,
    email: DataTypes.STRING,
  }, {
    timestamps: false
  });
  Users.associate = function (models) {
    this.hasMany(models.GameHistory);
    this.belongsTo(models.Friend, {
      foreignKey: 'user_id'
    });
  };


게임 히스토리 모델

const GameHistory = sequelize.define('GameHistory', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        room_id: DataTypes.STRING,
        user_id: DataTypes.INTEGER,
        speed: DataTypes.INTEGER, //words per minute
        accuracy: DataTypes.DECIMAL(10,2)
    });
    game_history.associate = function (models) {
        this.belongsTo(models.Users, {
            foreignKey: 'user_id'
        });
    };


친구를 연결하고 싶기 때문에

let my_friends = await Friend.findAll({
    where: {
        status: 1,
        user_id: req.user.id  // this is my user id
    },
    attributes: ['invite_user_id'],
    include: {
        model: Users,
        as: 'invite_user',
        include: {
            model: GameHistory,
            attributes: []
        },
        attributes: {
            include: [   
                [Sequelize.fn('ROUND', Sequelize.fn('AVG', Sequelize.col('speed')), 2), 'avg_speed'],
                [Sequelize.fn('AVG', Sequelize.col('accuracy')), 'avg_accuracy'],
            ]
        },
    }
});


이것이 나와 연결된 모든 친구를 반환하기를 바랍니다. 그러나 이것은 모두가 아니라 1명의 친구만 반환합니다. Round, Avg Sequelize 함수가 없으면 모두 올바르게 반환되지만 이러한 속성을 추가하면 1만 반환됩니다.

{
  "invite_user_id": 11,
  "invite_user": {}    //// ----> user data empty here
},
{ 
  "invite_user_id": 8,
  "invite_user": {
      {
         "user_avatar": "http://111.jpg",
         "id": 8,
         "user_id": "ninja",
         "user_name": "xyz",
         "nick_name": null,
...


GameHistory에 일부 데이터가 있으면 비어 있는 GameHistory 없이 올바르게 반환되며 친구 1명만 반환됩니다.

그래서 제 질문은 빈 테이블에 속편화 함수(Round, Avg)를 사용하는 방법입니다.

참조:
https://stackoverflow.com/questions/73440280/how-to-add-sequelize-function-attributes-in-include-model

좋은 웹페이지 즐겨찾기