【问题标题】:Deleting a Vapor Fluent Pivot删除 Vapor Fluent 枢轴
【发布时间】:2017-08-17 02:54:19
【问题描述】:

我正在使用 Vapor 编写服务器端 Swift API,并使用 Fluent 访问我的 Postgres 数据库。它运行良好,但我有几个关于 Pivots 的问题。

我有一个 Feed 模型和一个 Article 模型。 Feed 包含许多文章,一篇文章可以出现在许多 Feed 中。这是 Fluent 定义的兄弟关系,我有一个可以很好地将文章添加到提要的 Pivot。但是,目前可以将同一篇文章多次添加到同一个 Feed,因为 Feed_Article Pivot 表上的主键是它自己的唯一 id 字段。

我有两个问题:

  1. 如何确定 Pivot 是否已存在?

    • 我是否需要获取 Feed 的同级文章并通过它们查看文章的 ID 是否已经存在?好像有点痛。
  2. 如何删除数据透视关系?

    • 即。如何从 Feed 中删除文章?
    • 目前我能做到的唯一方法是编写原始 SQL 以从 Feed_Article 中删除,但这似乎是错误的。

我正在使用 VaporPostgreSQL 驱动程序,所以我不确定是否可以使用所有 Fluent 实现(例如,我不能使用 UUID id,因为它们还不是该驱动程序的一部分。)

谢谢大家

--TJ

补充:

我最终创建了一个 Pivot 扩展。它有效,但感觉应该有更好的方法来做到这一点。无论如何,分享以防万一。

extension Pivot {

static func remove(leftId: Node?, rightId: Node?) throws {
    /// Get the database driver
    guard let db = drop.database?.driver as? PostgreSQLDriver else {
        Logger.error("Failed to get database")
        return
    }

    /// Check that we have valid id's
    guard let leftId = leftId?.int, let rightId = rightId?.int else {
        Logger.error("Invalid id's")
        return
    }

    /// Delete the rows
    let sql = "DELETE FROM \(name) WHERE \(left.name)_\(left.idKey) = \(leftId) AND \(right.name)_\(right.idKey) = \(rightId)"
    Logger.debug("SQL: \(sql)")
    try db.raw(sql)
}

}

【问题讨论】:

    标签: swift pivot fluent vapor


    【解决方案1】:

    您应该能够像任何其他 Fluent 对象一样查询、删除等枢轴。

    例如:

    try Pivot<User, Pet>.query().fiter("user_id", x).delete()
    

    在 Fluent 2(撰写本文时为 2.0.0-beta.1)中,convenience methods 关系上的 Siblings 用于执行此操作。

    例如:

    try user.pets.add(newPet)
    

    【讨论】:

    • 工作如梦!我没想过要使用过滤器。非常感谢! --TJ
    猜你喜欢
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2018-05-30
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多