繁体   English   中英

使一列依赖于关联 Sequelize

[英]Make one column dependent on association Sequelize

我有一张名为HOUSE的桌子。 它有一个名为STATUS的列。

我还有一个名为TASK的表,它还有一个名为STATUS的列。

每个房子都有很多任务。 如果有一项任务的状态为inProgress ,则房屋状态应为inProgress 如果所有的任务都done ,那么房子就done

我希望房子的这个状态栏取决于它所有任务的状态。

当我调用/getHouses时,我会为每个房子 object 添加一个名为status的属性,因为目前我在HOUSE表中没有STATUS列。

exports.getMyHouses = (req, res) => {
  const page = myUtil.parser.tryParseInt(req.query.page, 0)
  const limit = myUtil.parser.tryParseInt(req.query.limit, 10)

  db.House.findAndCountAll({
    where: { userId: req.user.id },
    include: [
      {
        model: db.Task,
        as: "task",
        include: [
          {
            model: db.Photo,
            as: "photos"
          }
        ]
      },
      {
        model: db.Address,
        as: "address"
      }
    ],
    offset: limit * page,
    limit: limit,
    order: [["id", "ASC"]],
  })
    .then(data => {
      let newData = JSON.parse(JSON.stringify(data))
      const houses = newData.rows

      for (let house of houses) {
        house.status = "done"

        const tasks = house.task
        for (let task of tasks) {
          if (task.status == "inProgress") {
            house.status = "inProgress"
            break
          }
        }
      }

      res.json(myUtil.response.paging(newData, page, limit))
    })
    .catch(err => {
      console.log("Error get houses: " + err.message)
      res.status(500).send({
        message: "An error has occured while retrieving data."
      })
    })
}

编辑:我刚刚意识到,也许每次任务状态有更新时,我都可以更新房屋的状态列。 我以前从来没有想过这个。

但是,如果有人能确认这是一个好策略或者是否有更好的策略,我仍然会喜欢它。

只要您不需要按房屋状态过滤,您拥有的选项是可行的。 这基本上称为虚拟字段(因为它不是直接来自数据库的东西)。 如果确实需要按此字段进行过滤,则需要查询所有 InProgress 任务并获取唯一的房屋 ID。

您也可以在任务更新时更新房屋的状态列,但如果有多个请求将任务更新到同一个房屋,您可能会遇到一些竞争条件。 如果您也是,请务必在此处进行交易。 查询/过滤具有 InProgress 任务的房屋会更快,因为您可以直接查询它。 但是,更新会更慢,因为您需要运行任务更新、任务计数查询和房屋更新查询。

两者各有优缺点,主要取决于您的应用程序设计要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM