删除Vapor Fluent Pivot

时间:2017-03-24 08:42:37

标签: swift pivot fluent vapor

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

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

我有两个问题:

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

    • 我是否需要获取Feed的兄弟文章并通过它们查看文章的ID是否已经存在?看起来有点痛苦。
  2. 如何删除Pivot关系?

    • IE中。如何从Feed中删除文章?
    • 目前我能做到的唯一方法是将原始SQL写入Feed_Article中删除,但这似乎不对。
  3. 我使用的是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)
    }
    
    }
    

1 个答案:

答案 0 :(得分:2)

您应该像任何其他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)