在 Vapor 4 中使用 Fluent 进行复杂查询

Posted

技术标签:

【中文标题】在 Vapor 4 中使用 Fluent 进行复杂查询【英文标题】:Complex query using Fluent in Vapor 4 【发布时间】:2020-06-04 05:59:59 【问题描述】:

我想查询在兄弟姐妹字段中包含特定用户的聊天。

简化模型:

final class Chat: Model, Content 

  @Siblings(through: ChatUser.self, from: \.$chat, to: \.$user)
  var users: [User]



final class User: Model, Content 

  @Siblings(through: ChatUser.self, from: \.$user, to: \.$chat)
  var chats: [Chat]

我的获取路线:

func fetch(req: Request) throws -> EventLoopFuture<[Chat]> 

    let user = try req.auth.require(User.self)

    return Chat
      .query(on: req.db)
      .filter("users", .contains(inverse: false, .anywhere), user)
      .all()

我收到[ ERROR ] server: column chats.users does not exist (errorMissingColumn)

我怎样才能以正确的方式做这样的过滤器?

【问题讨论】:

【参考方案1】:

如果我正确理解了您的要求,您应该从User 结尾的兄弟关系开始,而不是Chat。然后,您的查询将简化为:

func fetch(req: Request) throws -> EventLoopFuture<[Chat]> 

    let user = try req.auth.require(User.self)

    return User
      .query(on: req.db)
      .filter(\.$id == user.id!)
      .with(\.$chats)
      .first()
      .unwrap(or:Abort(.internalServerError))
      .map
      
           chattyUser in
           return chattyUser.chats
      

【讨论】:

以上是关于在 Vapor 4 中使用 Fluent 进行复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Vapor 命令中使用 Fluent

Vapor 2,Fluent 模型子类

如何在 Vapor/Fluent 中正确查询 Postgres JSONB 字段

Vapor fluent 不会在违反外键约束时抛出

Vapor Fluent 如何向现有表添加新的必填字段键

如何向 Pivot 添加附加信息(使用 Fluent)?