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

时间:2017-10-26 19:16:51

标签: mysql vapor

我有一个通过Attends表相关的Persons表和一个Events表,当我希望记录一个人应该参加某个特定角色的特定事件这一事实时,Attends表中存在一条记录(例如组织者等):

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等方式迭代它并不是很明显。

2 个答案:

答案 0 :(得分:1)

Fluent relations的Vapor文档可能正是您所寻找的。

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

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

然后获得角色:

let roles = person.roles.all()

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

答案 1 :(得分:0)

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

我认为这是一个相当新的(已记录)功能: 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)的元组。我不确定它如何处理多对一关系,或者每个重复的引用是否是相同的类实例。