Нужна помощь в выполнении многих <-> многих матчей с Fluent in Vapor 3 - PullRequest
1 голос
/ 28 февраля 2020

У меня есть приложение 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) { $0.filter(\.userId == user.id!).filter(\.userId == user.id!) }.flatMap { ... }

плюс фильтр, который говорит, где groupId == groupId.

Есть мысли или предложения?

1 Ответ

0 голосов
/ 08 марта 2020

Я не думаю, что вы можете сделать это в одном запросе, но вы можете попробовать что-то вроде:

UserGroups.query(on:request).filter(\.userId == user1.id!).all().flatMap
{
    groups in
    groups.map { $0.id! }.flatMap
    {
        groupIds in
        UserGroups.query(on:request).filter(\.userId == user2.id!).filter(\.groupId ~~ groupIds).all().flatMap
        {
            // do your work here
        }
    }
}
...