使一列依赖于关联Sequelize



我有一个名为HOUSE的表。它有一个名为STATUS的列。

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

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

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

当我调用/getHouses时,以下是我为每个房子对象添加一个名为status的属性的操作,因为当前我在house表中没有ATUS

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."
})
})
}

EDIT:我刚刚意识到,也许每次任务状态更新时,我都可以更新房子的状态栏。我以前从未想过这个。

但如果有人能证实这是一个好的策略,或者有更好的策略,我仍然会很高兴。

只要不需要根据房子的状态进行筛选,您所拥有的选项是可行的。这基本上被称为虚拟字段(因为它不是直接来自数据库的东西(。如果您确实需要通过此字段进行筛选,那么您需要查询所有正在进行的任务并获得唯一的房屋ID。

你也可以在任务更新时更新房子的状态栏,但如果有多个请求将任务更新到同一栋房子,你可能会遇到一些竞争条件。如果你也是,请确保在这里运行事务。使用InProgress任务查询/筛选房屋会更快,因为您可以直接查询。然而,更新速度会较慢,因为您需要运行任务更新、任务计数查询和房屋更新查询。

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

最新更新