簡體   English   中英

無法創建用於查詢嵌套父項的 Fluent ORM 查詢

[英]Unable to create a Fluent ORM query for querying nested parents

我有 3 個表,LastName、MiddleName 和 FirstName ... FirstName 有 MiddleNameID 作為父級,MiddleName 有 LastName.id 作為父級

模型看起來像這樣

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 DSL 進行多重連接? 或者也許給我所有與中間名和/或姓氏匹配的名字

如果我不得不寫一個 SQL 查詢可能看起來像這樣

                  SELECT DISTINCT ON (ln.id, mn.id)
                  ln.name, mn.name, fn.*
                  FROM last_name ln
                  LEFT JOIN middle_name mn ON ln.id = mn.last_name_id
                  LEFT JOIN first_name fn ON fn.middle_name_id = mn.id
                  WHERE ( mn.name <> '' AND fn.name <> '' ) AND
                  (true AND ln.name ~ 'smith')
                  ORDER BY ln.id, mn.id, fn.id

您可以在 Fluent 查詢中執行此操作,例如:

return Lastname.query(on: req)
    .filter(\.$name == "Smith")
    .with(\.$middle_names) { $0.with(\.$firstnames) }
    .all()
    .flatMap { wholeNames in
    let result = wholeNames.filter { $0.middle_names.contains("James") }
    // continue
}

這將為您提供所有中間名為 James 的 Smiths。 您可以將其用作 OR 變體的基礎。 它首先過濾史密斯的姓氏,然后用with連接中間名,但閉包確保名字也被連接起來。

我認為沒有辦法將中間名過濾器構建到查詢中,所以我認為你必須按照我所展示的那樣去做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM