【问题标题】:Database seeding and Eager Loading in VaporVapor 中的数据库种子和 Eager Loading
【发布时间】:2021-12-06 16:53:45
【问题描述】:

这是我执行数据库播种的代码:

func prepare(on database: Database) -> EventLoopFuture<Void> {
       
       var citySaveResults: [EventLoopFuture<Void>] = []
       
       return User.query(on: database).first().flatMap({ user -> EventLoopFuture<Void> in
           
           guard let userId = user?.id else { return citySaveResults.flatten(on: database.eventLoop).transform(to: ()) }
           
           let cities = [
               City(id: UUID(), name: "London", isActive: true, createdAt: Date()),
               City(id: UUID(), name: "New York", isActive: true, createdAt: Date()),
               City(id: UUID(), name: "San Francisco", isActive: true, createdAt: Date()),
           ]
           
           for city in cities {
               city.plans.append(contentsOf: createPlans(cityId: city.id, userId: userId))
               citySaveResults.append(city.save(on: database))
           }
           
           return citySaveResults.flatten(on: database.eventLoop) .transform(to: ())
       })
   }

但它在一行中崩溃:

 city.plans.append(contentsOf: createPlans(cityId: city.id, userId: userId))
 Fatal error: Children relation not eager loaded, use $ prefix to access.

谁能解释我如何使用 Eager Loading 功能来避免在这种情况下崩溃?

这是我的城市模型:

final class City: Model {
    
    static let schema = "cities"
    
    @ID(key: .id) var id: UUID?
    
    @Field(key: "name") var name: String
    @Field(key: "isActive") var isActive: Bool
    
    @Children(for: \Plan.$city) var plans: [Plan]

    ...
}

【问题讨论】:

  • 您是否要在同一个迁移中拯救孩子(计划)?
  • 是的,我更新了我的问题。

标签: vapor


【解决方案1】:

Eager loading 仅顾名思义用于加载。要救孩子,你需要先救父母,然后分别救孩子。

    func prepare(on database: Database) -> EventLoopFuture<Void> {
       
       var citySaveResults: [EventLoopFuture<Void>] = []
       
       return User.query(on: database).first().flatMap { user -> EventLoopFuture<Void> in
           
           guard let userId = user?.id else { return citySaveResults.flatten(on: database.eventLoop).transform(to: ()) }
           
           let cities = [
               City(id: UUID(), name: "London", isActive: true, createdAt: Date()),
               City(id: UUID(), name: "New York", isActive: true, createdAt: Date()),
               City(id: UUID(), name: "San Francisco", isActive: true, createdAt: Date()),
           ]
           
           for city in cities {
               let saveResult = city.save(on: database).flatMap {
                   let plans = createPlans(cityId: city.id, userId: userId)
                   return plans.save(on: database)
               }
               citySaveResults.append(saveResult)
           }
           
           return citySaveResults.flatten(on: database.eventLoop) .transform(to: ())
       }
   }

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2014-06-09
    • 2011-03-14
    相关资源
    最近更新 更多