mysql连接所有字段_mysql – 从Vapor 3中的连接查询中获取所有字段

背景

给出以下示例模型(选择2个显示1-n关系的简单示例):

final class Company: MySQLModel {

var id: Int?

var name: String

}

final class Client: MySQLModel {

var id: Int?

var attr1: Int

var attr2: String

var companyId: Company.ID

static func prepare(on connection: MySQLDatabase.Connection) -> Future {

return Database.create(self, on: connection, closure: { builder in

try addProperties(to: builder)

builder.addReference(from: \.companyId, to: \Company.id, actions: .update)

})

}

}

有没有办法获取&返回JOINED查询的结果(例如:Company – Client // One-to-Many)而不需要原始查询?我尝试使用Query和Relationships但是没有办法一次性获取所有这些.

理想情况下,返回的数据将具有如下嵌套结构:

预期:

{

"name": "Alice",

"id": 0000000001,

"company": {

"id": 11111111,

"name": "Stack Overflow"

}

}

解决方案(又名解决方法)

我确实设法通过使用额外的结构(称为Wrapper,Box,Merged等)使其“工作”来保存所有实体,最后使用makeJSON将其返回到Controller内部.

let query = try db.query(Client.self)

.filter(\.attr1 > 123)

.filter(\.attr2 == "abc")

let client = try query.first()

// client.company is just an attribute of Client that uses

// the *parent* method to retrieve it

if let client = client, let company = try client.company.get() {

// others uses *children* method

let others = try client.others.limit(5).all()

let companyJSON = company.dictionary! // dictionary returns [String:Any] for any Encodable

let clientJSON = client.dictionary!

let merged = clientJSON.merging([ "company": companyJSON ], uniquingKeysWith: { (first, _) in first })

return merged

}

最后的评论

使用包装器实体是唯一的方法(不使用原始查询)?处理多级结果将非常繁琐.

Edit2:我最近迁移到Vapor3,因此新代码.我认为Vapor2的想法是一样的,但是由于Vapor3引入了Codable支持,你必须编写更多的代码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值