是否可以访问 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 实例。
我有一个人 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 实例。