【问题标题】:Use value in query to define the where of a sub query using sequelize使用查询中的值来定义使用 sequelize 的子查询的位置
【发布时间】:2019-12-20 00:47:30
【问题描述】:

我想使用情节表的年份列在进度表的位置中使用,而无需执行两个查询。 Sequelize 可以做到这一点吗?

这是我正在运行的查询。目前它使用的是静态年份,我希望它根据剧集年份动态生成。

// Associations
models.Episode.belongsTo(models.Unit, {foreignKey: 'unitId', targetKey: 'unitId'})
models.Unit.belongsToMany(models.Badge, {through: 'unitToBadge'})
models.Badge.belongsToMany(models.Unit, {through: 'unitToBadge'})
models.Badge.hasOne(models.Progress, {foreignKey: 'badgeId', targetKey: 'badgeId'})

// Get Episode->Unit->UnitToBadge->Badge->Progress from episodeId
const episode = await models.Episode.findOne({
  where: {
    episodeId: episodeId,
    unitId: {
      [Sequelize.Op.not]: null
    }
  },
  include: [
    {
      model: models.Unit,
      include: [
        {
          model: models.Badge,
          include: [
            {
              model: models.Progress,
              where: {
                userId: userId,
                complete: false,
                year: 2019  // TODO need to get the year dynamicly from episode
              }
            }
          ]
        }
      ]
    }
  ]
})

这是剧集表模型

const episode = (sequelize, DataTypes) => {
    const Episode = sequelize.define('episode', {
      episodeId: {
        type: DataTypes.INTEGER,
        unique: true
      },
      year: {
        type: DataTypes.INTEGER,
      },
      unitId: {
        type: DataTypes.INTEGER
      },
      updatedAt: {
        type: DataTypes.DATE(6),
        allowNull: true,
        defaultValue: sequelize.fn('NOW')
      },
      createdAt: {
        type: DataTypes.DATE(6),
        allowNull: true,
        defaultValue: sequelize.fn('NOW')
      }
    }, {
      indexes: [
        {
          unique: false,
          fields: ['updatedAt']
        }
      ]
    })

    return Episode
  }

  export default episode;

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    我无法在 Sequelize 文档中找到此案例.... 很奇怪,因为恕我直言,这是一个相对常见的情况。这是一种解决方案:

    where: { 
      userId: userId,
      complete: false,
      year: { $eq : Sequelize.col("episode.year")}   // set episode alias as needed
    },
    

    FWIW,虽然它是明智的,但 year : Sequelize.col("episode.year") 不起作用。

    【讨论】:

      【解决方案2】:

      我无法让$eq 工作,但每当我将其更改为[Sequelize.Op.eq] 时,它就可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-27
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多