是否可以访问 Vapor 中连接的 table 中的字段?

Is it possible to access fields in a joined table in Vapor?

我有一个人 table 和一个事件 table,它们通过参加 table 相关联,这样当我希望时,记录就存在参加 table记录某人应以特定角色(例如组织者等)参加特定活动的事实:

Persons
+----+-------------+
| id | surname     |
+----+-------------+
|  1 | Robinson    |
|  2 | Savage      |
...

Events
+----+-----------------------+
| id | name                  |
+----+-----------------------+
|  1 | Half Term Competition |
|  2 | Christmas Competition |
...

attends
+---------+----------+--------+
| eventId | personId | roleId |
+---------+----------+--------+
|       1 |        1 |      1 |
|       1 |        2 |      6 |
...

我想生成一个列表,列出参加活动的人员以及他们在做什么,但我找不到在 Vapor 查询中使用 .join() 来完成此操作的方法。似乎您可以过滤加入的 table,但不包括任何字段。我是不是遗漏了什么或者这是不可能的?

我已经尝试了以下主题的多种变体:

Person.join(Attends.self).filter(Attends.self,Event.foreignIdKey == eventId)

我得到了正确的个人记录,但无法从加入的参加记录中访问他们的 'role' 内容。

如果我做一个原始查询,那么它 returns 一个节点表示。我可以使用 Leaf 轻松地查看它,但是如何以我想要生成带有图像的 PDF 等的方式迭代它一点也不明显

Fluent relations 的 Vapor 文档可能就是您要查找的内容。

据我所知,您使用的是多对多(兄弟)关系,因此这段代码可能就是您想要的:

extension Persion {
    var roles: Siblings<Persion, Role, Pivot<Person, Role>> {
        return siblings()
    }
}

然后获取角色:

let roles = person.roles.all()

我可能看错了,因为我看不到你的代码,但它应该会给你一些指导。

这里的技巧是确保您正在利用数据库中的连接,而不是对每个关系结果进行单独查询——这不是最佳选择。

我认为这是一个相当新的(有记录的)功能: https://docs.vapor.codes/3.0/fluent/querying/#join

这允许以下类型的查询:

Client.query(on: conn).join(\Client.companyId, to: \Company.id)
    .filter(\.attr1 > 12)
    .filter(\Company.name == "ACME")
    .alsoDecode(Company.self)
    .all()

此代码returns (Client,Company) 的一个元组。我不确定它如何处理多对一关系或每个重复引用是否相同 class 实例。