【问题标题】:Sequelize Many-to-many querying modelSequelize 多对多查询模型
【发布时间】:2021-07-20 01:48:54
【问题描述】:

查询数据时遇到一些麻烦。 有 2 个具有多对多关系的模型。 第一个 - S3FileData,第二个 - 播放列表,它们通过 PlaylistContent 表连接。 S3FileData 也与用户连接,用户有很多播放列表。

我需要查询属于用户但未出现在用户播放列表中的 S3Files。

我有播放列表 ID,用户 ID。

我还需要 offset 和 limit 方法,所以我尝试使用 findAndCountAll 进行查询

但是没有运气。 非常感谢您的帮助:)

【问题讨论】:

  • 您可以发布您尝试过的内容吗?谢谢

标签: javascript sequelize.js


【解决方案1】:

您将需要包含(SQL 中的联接)来连接所有这些表。 像这样的东西,但首先你需要将你的模型(数据库表)交织在一起,看起来像这样:

User.belongsToMany(Profile, { through: Grant });
Profile.belongsToMany(User, { through: Grant });
User.hasMany(Grant);
Grant.belongsTo(User);
Profile.hasMany(Grant);
Grant.belongsTo(Profile);

参考: https://sequelize.org/master/manual/advanced-many-to-many.html

现在,一旦您完成了连接,您需要在 findAll(或 findAllAndCount 根据要求)中使用 include 关键字来使用这些连接:

一些基本代码(你需要尝试和调整,这是粗略的代码):

  S3Files.findAll({
  include: [
    {
      model: user,
      attributes: ['some columns']
      include: {
        model: userPlaylist,          
        attributes: ['some columns'],
        required: false 
    },
    where: {[Op.and]: Sequelize.where(Sequelize.col('userPlaylist.userId'), 'is not' null)},
    attributes: ['some columns']
  ]
});

最后,对于偏移量和限制,您需要LIMITOFFSET 的基本 SQL 逻辑

来自官方文档的示例 sn-p 用于偏移和限制:

Project
  .findAndCountAll({
     where: {
        title: {
          [Op.like]: 'foo%'
        }
     },
     offset: 10,
     limit: 2
  })

相同的参考: https://sequelize.org/v5/manual/models-usage.html

【讨论】:

  • 谢谢!但问题是要获取中间表中不存在的数据..:)
  • 其实这正是我放弃的代码打算做的。您可以调整将 findAll 放在中间表上的代码,然后左加入您要使用 having 子句过滤的主表?所有这些工作的同一要点是找到您期望触发的确切原始查询,然后找到它的 sequlize 转换。
  • 也尝试展示你所做的一些尝试,以便可以进行更正,空白没有人可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2017-03-19
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多