删除 Vapor Fluent Pivot

Deleting a Vapor Fluent Pivot

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

我有一个 Feed 模型和一个 Article 模型。 Feed 包含许多文章,一篇文章可以出现在多个 Fe​​ed 中。这是 Fluent 定义的兄弟关系,我有一个非常适合将文章添加到 Feed 的 Pivot。但是,目前可以将同一篇文章多次添加到同一个 Feed,因为 Feed_Article Pivot table 上的主键是它自己的唯一 ID 字段。

我有两个问题:

  1. 如何确定数据透视表是否已存在?

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

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

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

谢谢大家

--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)
}

}

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

例如:

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

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

例如:

try user.pets.add(newPet)