需要帮助在 Vapor 3 中与 Fluent 进行很多 <-> 很多匹配
Need help doing a many <-> many match with Fluent in Vapor 3
我有一个 Vapor 3 应用程序,我需要在其中确定是否有 2 个用户共享任何公共组。
所以我有 2 个模型用户和组。一个用户可以属于多个组。但是我有一个权限检查,如果两个用户共享一个公共组,他们可以互相发送消息。
final public class User: PostgreSQLModel {
public var id: Int?
var firstName: String
var lastName: String
}
extension User {
var containers: Siblings<User, Group, UserGroups> {
return siblings()
}
}
final public class Group: PostgreSQLModel {
public var id: Int?
var name: String
}
我想做的是这个
UserGroups.query(to: request).group(.or) { [=11=].filter(\.userId == user.id!).filter(\.userId == user.id!) }.flatMap { ... }
加上一个过滤器,说明 groupId == groupId。
有什么想法或建议吗?
我认为您无法在单个查询中完成,但您可以尝试类似的方法:
UserGroups.query(on:request).filter(\.userId == user1.id!).all().flatMap
{
groups in
groups.map { [=10=].id! }.flatMap
{
groupIds in
UserGroups.query(on:request).filter(\.userId == user2.id!).filter(\.groupId ~~ groupIds).all().flatMap
{
// do your work here
}
}
}
我有一个 Vapor 3 应用程序,我需要在其中确定是否有 2 个用户共享任何公共组。
所以我有 2 个模型用户和组。一个用户可以属于多个组。但是我有一个权限检查,如果两个用户共享一个公共组,他们可以互相发送消息。
final public class User: PostgreSQLModel {
public var id: Int?
var firstName: String
var lastName: String
}
extension User {
var containers: Siblings<User, Group, UserGroups> {
return siblings()
}
}
final public class Group: PostgreSQLModel {
public var id: Int?
var name: String
}
我想做的是这个
UserGroups.query(to: request).group(.or) { [=11=].filter(\.userId == user.id!).filter(\.userId == user.id!) }.flatMap { ... }
加上一个过滤器,说明 groupId == groupId。
有什么想法或建议吗?
我认为您无法在单个查询中完成,但您可以尝试类似的方法:
UserGroups.query(on:request).filter(\.userId == user1.id!).all().flatMap
{
groups in
groups.map { [=10=].id! }.flatMap
{
groupIds in
UserGroups.query(on:request).filter(\.userId == user2.id!).filter(\.groupId ~~ groupIds).all().flatMap
{
// do your work here
}
}
}