Sequelize用koa2是不能限制记录的。我能怎么做?
Sequelize with koa2 can't limit the record. How can I do?
async function selectCards ({
status,
teamId,
userId,
GMTTime,
cardId,
page,
pageSize
}) {
console.log(page, pageSize)
const teamWhere = {}
if (teamId) {
teamWhere.id = teamId
}
const cardWhere = {}
if (GMTTime) {
cardWhere.startAt = {
[Op.lt]: GMTTime
}
}
if (cardId) {
cardWhere.id = cardId
}
const userCardWhere = {
userId
}
if (status) {
userCardWhere.status = status
}
const result = await User.findOne({
where: {
id: userId
},
attributes: [],
include: {
model: Card,
where: cardWhere,
through: {
where: userCardWhere
},
include: {
model: Team,
where: teamWhere,
include: UserTeam
}
limit: pageSize // while it cause an error
}
})
if (result == null) return { rows: [] }
result.cards.map(card => {
card.dataValues.status = card.user_card.status
delete card.dataValues.user_card
card.dataValues.team.dataValues.isAdmin = card.team.user_teams[0].isAdmin
delete card.dataValues.team.dataValues.user_teams
return card
})
return result
}
当我尝试如上所述添加限制时
发生错误
Only HasMany associations support include.separate Error: Only HasMany associations support include.separate
虽然一张卡会有很多用户,一个用户可能有很多张卡
这是一个 'm:n' 协会
当我尝试使用
order: [['startAt', 'desc']]
也不行
所以我需要用更多的代码来限制它
result.cards.sort((card1, card2) => (
card2.startAt - card1.startAt
))
const ret = result.cards.slice((page - 1) * pageSize, page * pageSize)
return { rows: ret }
使用更多的代码不是一个好的选择,因为当数据太大时,它需要 O(nlogn) 来做
我可以通过 sequelize 得到一些解决方案吗?
对了,就是下面这个模特协会
Team.hasMany(Card, {
onDelete: 'CASCADE'
})
Card.hasOne(User, {
onDelete: 'CASCADE',
foreignKey: 'publishId'
})
Card.belongsTo(Team, {
onDelete: 'CASCADE'
})
Card.belongsToMany(User, { through: UserCard })
User.belongsToMany(Card, { through: UserCard })
User.hasMany(UserCard)
UserCard.belongsTo(User)
Card.hasMany(UserCard)
UserCard.belongsTo(Card)
您不能在包含多对多关联的父记录上使用 limit
(尤其是在包含 where
的情况下)。这来自 SQL。如果您加入一个父表和一个子表,然后以这种方式添加 limit
,您将获得前 N 个混合的父子记录,而不是前 N 个包含所有子记录的父记录。是的,你可以尝试一个简单的 SQL 查询,你会得到想要的结果,但 Sequelize 无法为你构建这样的查询。
但是,您可以尝试使用 sequelize.literal (和 SQL 子查询,如 (EXISTS (SELECT 1 FROM CHILD_TABLE WHERE PARENT_ID=PARENT_TABLE.ID))。在这种情况下,您无法在同一查询中获取此子记录,但您可以使用 limit
正确。之后,您可以使用父记录的 ID 列表分别获取所有子记录。
async function selectCards ({
status,
teamId,
userId,
GMTTime,
cardId,
page,
pageSize
}) {
console.log(page, pageSize)
const teamWhere = {}
if (teamId) {
teamWhere.id = teamId
}
const cardWhere = {}
if (GMTTime) {
cardWhere.startAt = {
[Op.lt]: GMTTime
}
}
if (cardId) {
cardWhere.id = cardId
}
const userCardWhere = {
userId
}
if (status) {
userCardWhere.status = status
}
const result = await User.findOne({
where: {
id: userId
},
attributes: [],
include: {
model: Card,
where: cardWhere,
through: {
where: userCardWhere
},
include: {
model: Team,
where: teamWhere,
include: UserTeam
}
limit: pageSize // while it cause an error
}
})
if (result == null) return { rows: [] }
result.cards.map(card => {
card.dataValues.status = card.user_card.status
delete card.dataValues.user_card
card.dataValues.team.dataValues.isAdmin = card.team.user_teams[0].isAdmin
delete card.dataValues.team.dataValues.user_teams
return card
})
return result
}
当我尝试如上所述添加限制时 发生错误
Only HasMany associations support include.separate Error: Only HasMany associations support include.separate
虽然一张卡会有很多用户,一个用户可能有很多张卡 这是一个 'm:n' 协会
当我尝试使用
order: [['startAt', 'desc']]
也不行
所以我需要用更多的代码来限制它
result.cards.sort((card1, card2) => (
card2.startAt - card1.startAt
))
const ret = result.cards.slice((page - 1) * pageSize, page * pageSize)
return { rows: ret }
使用更多的代码不是一个好的选择,因为当数据太大时,它需要 O(nlogn) 来做 我可以通过 sequelize 得到一些解决方案吗?
对了,就是下面这个模特协会
Team.hasMany(Card, {
onDelete: 'CASCADE'
})
Card.hasOne(User, {
onDelete: 'CASCADE',
foreignKey: 'publishId'
})
Card.belongsTo(Team, {
onDelete: 'CASCADE'
})
Card.belongsToMany(User, { through: UserCard })
User.belongsToMany(Card, { through: UserCard })
User.hasMany(UserCard)
UserCard.belongsTo(User)
Card.hasMany(UserCard)
UserCard.belongsTo(Card)
您不能在包含多对多关联的父记录上使用 limit
(尤其是在包含 where
的情况下)。这来自 SQL。如果您加入一个父表和一个子表,然后以这种方式添加 limit
,您将获得前 N 个混合的父子记录,而不是前 N 个包含所有子记录的父记录。是的,你可以尝试一个简单的 SQL 查询,你会得到想要的结果,但 Sequelize 无法为你构建这样的查询。
但是,您可以尝试使用 sequelize.literal (和 SQL 子查询,如 (EXISTS (SELECT 1 FROM CHILD_TABLE WHERE PARENT_ID=PARENT_TABLE.ID))。在这种情况下,您无法在同一查询中获取此子记录,但您可以使用 limit
正确。之后,您可以使用父记录的 ID 列表分别获取所有子记录。