Как отфильтровать данные во вложенном включении с помощью Sequelize? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь выполнить запрос, чтобы найти песни исполнителей, за которыми следует пользователь. У меня есть запрос Sequelize, подобный этому, однако он возвращает каждый результат песни в базе данных. Вот мой запрос:

Song.findAll({
    include: [
        {
            model: Artist,
            include: [
                {
                    model: User,
                    as: 'Followers',
                    where: { id: 3 }
                }
            ]
        }
    ]
}).then((result) => {
    res.status(200).send(result);
})

Между Artist и User существует отношение многие ко многим, в то время как между Artist и Song существует отношение один ко многим.

Я хочу получать только песни исполнителей, за которыми следует пользователь. Например, вот два набора данных, которые возвращаются.

Это один результат, который возвращается

Имеет смысл, потому что пользователь следует artistID = 9.

{
    "id": 4,
    "releaseDate": "1550188800",
    "title": "Beggar's song",
    "artistID": 9,
    "approved": true,
    "updatedAt": "2019-04-06T06:42:00.000Z",
    "Artist": {
      "id": 9,
      "followers": 4,
      "name": "Matt Maeson",
      "updatedAt": "2019-05-04T10:52:52.000Z",
      "Followers": [
        {
          "id": 3,
          "username": "uncvrd",
          "updatedAt": "2019-07-03T21:57:41.000Z",
          "UserArtist": {
            "userID": 3,
            "artistID": 9,
            "createdAt": "2019-02-17T00:00:00.000Z",
            "updatedAt": "2019-02-17T00:00:00.000Z"
          }
        }
      ]
    }
  },

Почему этот следующий возвращается ???

Пользователь не следует artistID = 22, поэтому свойство Artist имеет значение null, но это не должно возвращаться в моем запросе .... верно?

  {
    "id": 27,
    "releaseDate": "1550707200",
    "title": "Is It Love",
    "artistID": 22,
    "approved": true,
    "updatedAt": "2019-04-06T06:42:00.000Z",
    "Artist": null
  }

Спасибо за помощь!

Редактировать: вот мои модели Sequelize


Song.js

module.exports = (sequelize, DataTypes) => {
  const Song = sequelize.define('Submission', {
    releaseDate: DataTypes.STRING,
    title: DataTypes.STRING,
    artistID: DataTypes.INTEGER,
    approved: DataTypes.BOOLEAN,
  }, {});
  Song.associate = function (models) {
    Song.belongsTo(models.Artist, { foreignKey: 'artistID' });
  };
  return Song;
};

Artist.js

module.exports = (sequelize, DataTypes) => {
  const Artist = sequelize.define('Artist', {
    followers: DataTypes.INTEGER,
    name: DataTypes.STRING,
  }, {});
  Artist.associate = function (models) {
    // associations can be defined here
    Artist.hasMany(models.Song, { foreignKey: 'artistID' });
  };
  return Artist;
};

user.js

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    username: DataTypes.STRING,
  }, {});
  User.associate = function(models) {
    // associations can be defined here
    User.belongsToMany(models.Artist, { through: models.UserArtist, foreignKey: 'userID', otherKey: 'artistID' });
  };
  return User;
};

UserArtist.js

module.exports = (sequelize, DataTypes) => {
  const UserArtist = sequelize.define('UserArtist', {
    userID: DataTypes.INTEGER,
    artistID: DataTypes.INTEGER
  }, {});
  UserArtist.associate = function(models) {
    // associations can be defined here
  };
  return UserArtist;
};
...