使用 Fluent in Vapor 4 进行复杂查询
Complex query using Fluent in Vapor 4
我想查询兄弟姐妹字段中包含特定用户的聊天记录。
简化模型:
final class Chat: Model, Content {
@Siblings(through: ChatUser.self, from: \.$chat, to: \.$user)
var users: [User]
}
final class User: Model, Content {
@Siblings(through: ChatUser.self, from: \.$user, to: \.$chat)
var chats: [Chat]
}
我的获取路线:
func fetch(req: Request) throws -> EventLoopFuture<[Chat]> {
let user = try req.auth.require(User.self)
return Chat
.query(on: req.db)
.filter("users", .contains(inverse: false, .anywhere), user)
.all()
}
我得到[ ERROR ] server: column chats.users does not exist (errorMissingColumn)
如何以正确的方式进行此类过滤?
如果我没有正确理解您的要求,您应该从 User
结束的兄弟姐妹关系开始,而不是 Chat
。您的查询将简化为:
func fetch(req: Request) throws -> EventLoopFuture<[Chat]> {
let user = try req.auth.require(User.self)
return User
.query(on: req.db)
.filter(\.$id == user.id!)
.with(\.$chats)
.first()
.unwrap(or:Abort(.internalServerError))
.map
{
chattyUser in
return chattyUser.chats
}
}
我想查询兄弟姐妹字段中包含特定用户的聊天记录。
简化模型:
final class Chat: Model, Content {
@Siblings(through: ChatUser.self, from: \.$chat, to: \.$user)
var users: [User]
}
final class User: Model, Content {
@Siblings(through: ChatUser.self, from: \.$user, to: \.$chat)
var chats: [Chat]
}
我的获取路线:
func fetch(req: Request) throws -> EventLoopFuture<[Chat]> {
let user = try req.auth.require(User.self)
return Chat
.query(on: req.db)
.filter("users", .contains(inverse: false, .anywhere), user)
.all()
}
我得到[ ERROR ] server: column chats.users does not exist (errorMissingColumn)
如何以正确的方式进行此类过滤?
如果我没有正确理解您的要求,您应该从 User
结束的兄弟姐妹关系开始,而不是 Chat
。您的查询将简化为:
func fetch(req: Request) throws -> EventLoopFuture<[Chat]> {
let user = try req.auth.require(User.self)
return User
.query(on: req.db)
.filter(\.$id == user.id!)
.with(\.$chats)
.first()
.unwrap(or:Abort(.internalServerError))
.map
{
chattyUser in
return chattyUser.chats
}
}