【发布时间】:2017-08-17 02:54:19
【问题描述】:
我正在使用 Vapor 编写服务器端 Swift API,并使用 Fluent 访问我的 Postgres 数据库。它运行良好,但我有几个关于 Pivots 的问题。
我有一个 Feed 模型和一个 Article 模型。 Feed 包含许多文章,一篇文章可以出现在许多 Feed 中。这是 Fluent 定义的兄弟关系,我有一个可以很好地将文章添加到提要的 Pivot。但是,目前可以将同一篇文章多次添加到同一个 Feed,因为 Feed_Article Pivot 表上的主键是它自己的唯一 id 字段。
我有两个问题:
-
如何确定 Pivot 是否已存在?
- 我是否需要获取 Feed 的同级文章并通过它们查看文章的 ID 是否已经存在?好像有点痛。
-
如何删除数据透视关系?
- 即。如何从 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)
}
}
【问题讨论】: