Вот что я хочу сделать (используя postgresql):
Выберите H. «имя», A. «имя»
ОТ "Спички" М
РЕЙТИНГ "Команды" H ON M. "homeTeamID" = H.id
ПРИСОЕДИНИТЬСЯ "Команды" A ON M. "awayTeamID" = A.id
//This will give me an error
return Matches.query(on: request)
.join(\Teams.id, to: \Matches.homeTeamID)
.alsoDecode(Teams.self)
.join(\Teams.id, to: \Matches.awayTeamID)
.alsoDecode(Teams.self)
Вот ошибка:
{
Ошибка: правда,
Причина: "имя таблицы" Команды "указано несколько раз"
}
Любая помощь приветствуется! Благодарность!
3 ответа
@arema, я пытался воспроизвести ваш вариант использования, и у меня была похожая проблема с Fluent. Я сообщил о проблеме на github Fluent: https://github.com/vapor/fluent/issues/563
Вот обходной путь, но это далеко не элегантно.
// Requires conforming `Match` to hashable, Equatable.
func getMatches2Handler(_ req: Request) throws -> Future<[MatchObjects]> {
return map(
to: [MatchObjects].self,
Match.query(on: req).join(\Team.id, to: \Match.homeTeamID).alsoDecode(Team.self).all(),
Match.query(on: req).join(\Team.id, to: \Match.awayTeamID).alsoDecode(Team.self).all()
) { homeTuples, awayTuples in
let homeDictionary = homeTuples.toDictionary()
let awayDictionary = awayTuples.toDictionary()
var matchObjectsArray: [MatchObjects] = []
matchObjectsArray.reserveCapacity(homeDictionary.count)
for (match, homeTeam) in homeDictionary {
let awayTeam = awayDictionary[match]!
matchObjectsArray.append(MatchObjects(match: match, homeTeam: homeTeam, awayTeam: awayTeam))
}
return matchObjectsArray
}
}
//...
extension Array {
func toDictionary<K,V>() -> [K:V] where Iterator.Element == (K,V) {
return self.reduce([:]) {
var dict:[K:V] = $0
dict[$1.0] = $1.1
return dict
}
}
}
Понимаю, что это старый вопрос, но у меня была похожая проблема, и я решил ее альтернативным способом, используя необработанный SQL-запрос.
Ниже будут добавлены дополнительные столбцы для названия команды хозяев и гостей. Вам нужно создать MatchObject, чтобы декодировать результат и сделать соединение специфичным для ваших обстоятельств.
func matchObjects(_ req: Request) throws -> Future<[MatchObject]> {
return req.withPooledConnection(to: .psql, closure: { conn in
return conn.raw("""
SELECT "Matches".*, h.name as home_team_name, a.name as away_team_name
FROM "Matches"
INNER JOIN "Teams" as h ON "Matches"."homeTeamID" = h.id
INNER JOIN "Teams" as a ON "Matches"."awayTeamID" = a.id
""").all(decoding: MatchObject.self)
})
}
Я создал тестовый проект здесь: https://github.com/mixio/multi-join-test
Похожие вопросы
Новые вопросы
postgresql
PostgreSQL - это система управления объектно-реляционными базами данных с открытым исходным кодом (ORDBMS), доступная для всех основных платформ, включая Linux, UNIX, Windows и OS X. Пожалуйста, указывайте свою точную версию Postgres, задавая вопросы. Вопросы, касающиеся администрирования или расширенных функций, лучше всего направлять на dba.stackexchange.com.