删除 Vapor Fluent Pivot
Deleting a Vapor Fluent Pivot
我正在使用 Vapor 编写服务器端 Swift API,使用 Fluent 访问我的 Postgres 数据库。它运行良好,但我有几个关于 Pivots 的问题。
我有一个 Feed 模型和一个 Article 模型。 Feed 包含许多文章,一篇文章可以出现在多个 Feed 中。这是 Fluent 定义的兄弟关系,我有一个非常适合将文章添加到 Feed 的 Pivot。但是,目前可以将同一篇文章多次添加到同一个 Feed,因为 Feed_Article Pivot table 上的主键是它自己的唯一 ID 字段。
我有两个问题:
如何确定数据透视表是否已存在?
- 我是否需要获取 Feed 的同级文章并浏览它们以查看文章的 ID 是否已经存在?好像有点疼。
如何删除数据透视关系?
- 即。如何从 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)
我正在使用 Vapor 编写服务器端 Swift API,使用 Fluent 访问我的 Postgres 数据库。它运行良好,但我有几个关于 Pivots 的问题。
我有一个 Feed 模型和一个 Article 模型。 Feed 包含许多文章,一篇文章可以出现在多个 Feed 中。这是 Fluent 定义的兄弟关系,我有一个非常适合将文章添加到 Feed 的 Pivot。但是,目前可以将同一篇文章多次添加到同一个 Feed,因为 Feed_Article Pivot table 上的主键是它自己的唯一 ID 字段。
我有两个问题:
如何确定数据透视表是否已存在?
- 我是否需要获取 Feed 的同级文章并浏览它们以查看文章的 ID 是否已经存在?好像有点疼。
如何删除数据透视关系?
- 即。如何从 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)