如何解决Slick 中插入行的条件插入返回选项
我正在尝试在表中创建一个条件插入,其中包含对事件的响应。事件可能对它可以支持的回复/与会者数量有限制,以防止超额预订,我想在插入新回复之前检查状态。
表与我拥有的数据库模型相匹配(ID 由 DB/auto inc 生成):
case class Event(id: Option[Int],name: String,limitedCapacity: Option[Int])
case class Response(id: Option[Int],eventId: Int,email: String)
我已经构建了一个 SQL 语句来描述我的条件插入(例如,只有在事件没有容量限制或响应数量小于限制时才插入),如下所示:
INSERT INTO responses(eventId,email)
SELECT :eventId,:email
FROM events
WHERE id = :eventId
AND (limitedCapacity IS NULL
OR (SELECT COUNT(1) FROM responses WHERE eventId = :eventId) < limitedCapacity);
但我不知道如何将其转换为也返回插入行的 Slick DSL。我正在使用 PostgreSQL,所以我知道 return-row-on-insert 至少可以用于正常插入。
以下是一些代码,显示了我所追求的内容,但我希望将其作为单个事务:
def create(response: Response): Future[Option[Response]] = {
val event = db.run(events.filter(_.id === response.eventId).result.head)
if (event.limitedCapacity.isEmpty) {
db.run((responses returning responses) += response).map(Some(_))
}
else {
val responseCount = db.run(responses.filter(_.eventId === response.id).length.result)
if (responseCount < event.limitedCapacity.get) {
db.run((responses returning responses) += response).map(Some(_))
}
else {
Future.sucessful(None)
}
}
}
如果无法返回插入的行,那很好,但我至少需要对插入进行某种确认。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。