[英]Is it possible to access fields in a joined table in Vapor?
我有一个通过Attends表相关的Persons表和一个Events表,当我希望记录一个人将要参加特定角色的特定事件时(如组织者,等等。):
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()找到一种方法。 您似乎可以对已连接的表进行过滤,但不包括任何字段。 我错过了什么或这是不可能的?
我在以下主题上尝试了很多变化:
Person.join(Attends.self).filter(Attends.self,Event.foreignIdKey == eventId)
我得到了正确的人员记录,但无法从已加入的出席记录中访问他们的“角色”。
如果我执行原始查询,则返回节点表示。 我可以使用Leaf轻松查看它,但是如何以我想要生成带图像的PDF等方式迭代它并不是很明显。
关于Fluent关系的Vapor docs可能就是您正在寻找的。
据我所知,你使用的是多对多(兄弟)关系,所以这段代码可能就是你想要的:
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()
此代码返回(Client,Company)的元组。 我不确定它如何处理多对一关系或每个重复引用是否是同一个类实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.