【问题标题】:Is it possible to access fields in a joined table in Vapor?是否可以访问 Vapor 中连接表中的字段?
【发布时间】:2018-04-08 07:10:54
【问题描述】:

我有一个 Persons 表和一个 Events 表,它们通过 Attends 表相关联,因此当我希望记录一个人应以特定角色参加特定活动的事实时,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 的方式对其进行迭代并不明显。

【问题讨论】:

标签: mysql vapor


【解决方案1】:

Fluent relations 的 Vapor 文档可能是您正在寻找的。​​p>

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

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

然后获取角色:

let roles = person.roles.all()

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多