繁体   English   中英

删除蒸气流枢轴

[英]Deleting a Vapor Fluent Pivot

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

我有一个Feed模型和一个Article模型。 Feed中包含许多文章,并且文章可以出现在许多Feed中。 这是Fluent定义的同级关系,我有一个Pivot,可以很好地将文章添加到Feed中。 但是,由于Feed_Article Pivot表的主键是它自己的唯一ID字段,因此当前可以多次将同一Article添加到同一Feed中。

我有两个问题:

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

    • 我是否需要获取Feed的同级文章,并仔细检查它们的ID是否已在其中? 似乎有点痛苦。
  2. 如何删除数据透视关系?

    • IE浏览器。 如何从Feed中删除文章?
    • 目前,我唯一的方法是编写要从Feed_Article中删除的原始SQL,但这似乎是错误的。

我正在使用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)
}

}

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

例如:

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

在Fluent 2(撰写本文时为2.0.0-beta.1)中,在Siblings关系上有方便的方法可以做到这一点。

例如:

try user.pets.add(newPet)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM