简体   繁体   English

仅当父级存在于 Vapor 中时才使用 Fluent 创建记录

[英]Create record only if parent exists in Vapor using Fluent

I have 3 tables, LastName, MiddleName and FirstName, I would like to create a new record or update record in FirstName, MiddleName only if lastName exists.我有 3 个表,LastName、MiddleName 和 FirstName,我想在 FirstName、MiddleName 中创建新记录或更新记录,前提是 lastName 存在。 if last name does not exist, then would like to return error back.如果姓氏不存在,则想返回错误。


final class LastName: Model, Content {
    static let schema = "lastnames"
    
    @ID(key: .id)
    var id: UUID?

    @Field(key: "name")
    var name: String

    
    @Children(for: \.$lastname)
    var middle_names: [MiddleName]
    
    init() { }

    init(id: UUID? = nil, name: String) {
        self.id = id
        self.name = name
    }
}

final class MiddleName: Model, Content {
    static let schema = "middlenames"
    
    @ID(key: .id)
    var id: UUID?

    @Parent(key: "last_name_id")
    var lastname: LastName
    
    @Field(key: "name")
    var name: String

    @Children(for: \.$middleNameId)
    var firstNames: [FirstName]
    
    init() { }

    init(id: UUID? = nil, lastname: LastName, name: String ) {
        self.id = id
        self.lastname = lastname
        self.name = name
    }
}


final class FirstName: Model, Content {
    static let schema = "firstnames"
    
    @ID(key: .id)
    var id: UUID?
    
    @Parent(key: "middle_name_id")
    var middleNameId: MiddleName
    
    
    @Field(key: "name")
    var name: String
   
    
    init() { }

    init(id: UUID? = nil, middleNameId: MiddleName, name: String) {
        self.id = id
        self.middleNameId = testBundleId
        self.name = name
    }
}

Fluent docs are very minimal on creating new record by doing nested joins,As ID's are auto generated when creating Lastname, how do I get the ID for creating MiddleName/FirstName.流利的文档在通过嵌套连接创建新记录方面非常少,因为 ID 是在创建姓氏时自动生成的,我如何获取用于创建 MiddleName/FirstName 的 ID。 Also are there any good example of doing an update or create in multiple tables based on relationships?还有任何基于关系在多个表中进行更新或创建的好例子吗?

Basically I want fluent to do something like基本上我想要流利地做类似的事情

 LastName.query(on: req.db).filter(\.$name == "Smith")
            .first()
            .unwrap(or: Abort(.notFound))
            // Now Find if middle name exists, if exists use the ID to create first name and maybe even update middle name table, 
            // if middle name does not exist, create middle name record, then use the new ID to create first name record
            // return the new record(s) as some new Swift Codable DTO

You can do something like你可以做类似的事情

LastName.query(on: req.db).filter(\.$name == "Smith")
  .first()
  .unwrap(or: Abort(.notFound))
  .flatMap { lastName in
    let middlenameQuery = MiddleName.query(on: req.db).filter(\.$name == "Jane").first().flatMap { middlenameFound in
      if let middleName = middlenameFound {
        return req.eventLoop.future(middleName)
      } else {
        let newMiddlename = Middlename(name: "Jane")
        return newMiddlename.create(on: req.db).transform(to: newMiddlename)
      }
    }
    return middlenameQuery.flatMap { middlename in
      // Use last name and middle name here
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM