当前位置: 首页 > 知识库问答 >
问题:

无法创建用于查询嵌套父对象的流畅ORM查询

空佐
2023-03-14

我有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
    }
}

我想要这样的查询,比如给我所有的名字记录,其中lastname==Smith和/或middle==James。。。不确定如何使用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

共有1个答案

潘嘉佑
2023-03-14

您可以在流畅的查询中执行此操作,例如:

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
}

这将给你所有中间名为詹姆斯的史密斯一家。您可以将其用作OR变体的基础。它首先过滤史密斯的姓氏,然后用连接中间名,但闭包确保名字也连接在一起。

我认为没有办法将中间名过滤器构建到查询中,所以我认为您必须按照我所展示的那样做。

 类似资料:
  • 让我们考虑一下这些帖子的集合。每个帖子都有一个评论数组,每个评论都有一个字符串数组,带有键“likes”,表示喜欢该评论的用户。 如何使用mongoose检查用户是否喜欢具有给定ID的评论?

  • 有了jOOQ惊人的多集算子,我们能够查询嵌套列表并将其映射到pojo对象。现在,我试图找到一种方法来同时映射单个嵌套对象。例如,我有一个组合的自定义pojo类,如: 我想在一个步骤中查询并获取它。因此,我目前的工作解决方案是: 这包括一个预初始化的字段列表,其目的是以某种方式告诉JOOQ从“教师”映射教师对象。*”列。 我现在想知道在这方面是否有更直观的解决方案。我曾尝试使用row运算符,但到目前

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。

  • 问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个:

  • 问题内容: 我有一个如下所示的elasticsearch索引集合, 现在,我需要通过匹配其值来搜索文档。(是一些字段,其值存储在其中)对于字段,如果与上面的文档匹配。 我尝试将其映射为嵌套对象,但是无法编写查询来搜索2个或更多匹配其各自值的查询。 问题答案: 这就是我要做的。您需要通过(或)两个嵌套查询对每个条件对进行AND 运算,因为您要匹配同一父文档中的两个不同的嵌套元素。