В настоящее время я использую Vapor для базы данных и наткнулся на контрольно-пропускной пункт, с которым я мог бы помочь.
В настоящее время у меня есть объект Business
, у которого [AccessPoint]
потомков.Каждый AccessPoint
сам имеет номер [AccessPointContactMethod]
.
. AccessPointContactMethod
может ссылаться на своего родителя AccessPoint
, проверяя его свойство accessPointID
, которое устанавливается Vapor при создании родительских дочерних отношений.
На самом деле, я использую это, чтобы убедиться, что при создании нового AccessPointContactMethod
, если у родителя AccessPoint
уже есть дочерний элемент с тем же адресом, мы отменяем запрос post:
return AccessPointContactMethod.query(on: req).group(.and) { and in
and.filter(\.contactMethodAddress == contactMethod.contactMethodAddress)
and.filter(\.accessPointID == contactMethod.accessPointID)
}.all()
.flatMap(to: AccessPointContactMethod.self) { methods in
if methods.isEmpty {
return contactMethod.save(on: req)
}
else {
let duplicateContactMethodStatus = HTTPResponseStatus.custom(code: 600, reasonPhrase: "Duplicate Contact Method")
throw Abort(duplicateContactMethodStatus)
}
}
Итак, это приводит меня к проблеме, с которой я столкнулся.На данный момент я проверяю, есть ли в этом AccessPoint
дублирующиеся адреса, но я хочу проверить все AccessPoint
объекты, принадлежащие одному Business
, и есть ли AccessPoint
, которыесодержит AccessPointContactMethod
с тем же адресом, тогда мы отменяем запрос.
Поэтому мне кажется, что мне нужен способ добраться до объекта Business
grandparent и перебрать [AccessPoint]
дети за любые дубликаты.
Vapor, реактивное программирование, базы данных - все это совершенно новое для меня, поэтому я уверен, что я не описал этот вопрос чудесным образом, но если кто-то может понять, что я пытаюсь сделать, иесть какие-либо идеи, я буду очень признателен!