Отношения многие ко многим в Vapor 3 с Fluent - PullRequest
0 голосов
/ 11 мая 2018

Мне было интересно, как создать отношения «многие ко многим» в Vapor 3, используя Fluent и FluentMySQL, как описано в документах Vapor 2

К сожалению, документы для Vapor 3 еще не были обновлены, а реализация протокола Pivot изменилась.

Вот что я пытаюсь сделать: у меня есть два класса, User и Community. Community имеет members, а User s могут быть членами нескольких Community s.

В настоящее время мой код выглядит так:

import Vapor
import FluentMySQL

final class Community: MySQLModel {
    var id: Int?
    //Community Attributes here
}

final class User: MySQLModel {
    var id: Int?
    //User Attributes here
}

extension Community {
    var members: Siblings<Community, User, Pivot<Community, User>> {
        return siblings()
    }
}

Однако это вызывает следующие ошибки компилятора:

Cannot specialize non-generic type 'Pivot' и Using 'Pivot' as a concrete type conforming to protocol 'Pivot' is not supported.

Я видел, что есть расширение протокола, называемое ModifiablePivot, но я не знаю, как его использовать, поскольку нигде нет документации или примера кода.

Любая помощь приветствуется. Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Полный код:

import Vapor
import FluentSQLite

final class Community: SQLiteModel {
    var id: Int?
    //Community Attributes here
}

final class User: SQLiteModel {
    var id: Int?
    //User Attributes here
}

extension Community {
    var members: Siblings<Community, User, CommunityUser> {
        return siblings()
    }
}

final class CommunityUser: SQLitePivot {
    typealias Left = User
    typealias Right = Community
    static let leftIDKey: LeftIDKey = \.userID
    static let rightIDKey: RightIDKey = \.communityID
    var id: Int?
    var userID: Int
    var communityID: Int
}
0 голосов
/ 16 августа 2018

У меня была та же проблема, и мне не хватило обоих ответов, поэтому я просто публикую свое решение, которое сработало для меня.

// in CommunityUser.swift
import Vapor
import FluentMySQL


final class CommunityUser: MySQLPivot {

    typealias Left = User
    typealias Right = Community

    static var leftIDKey: LeftIDKey = \.userID
    static var rightIDKey: RightIDKey = \.communityID

    var id: Int?
    var userID: Int
    var communityID: Int

    init(id: Int?, userID: Int, communityID: Int) {
        self.id = id
        self.userID = userID
        self.communityID = communityID
    }

}

// CommunityUser didn't conform to MySQLMigration
// This simple line solves the problem
extension CommunityUser: MySQLMigration { }

Для меня CommunityUser также нужно былоперенести в базу данных.

// in configure.swift
migrations.add(model: CommunityUser.self, database: .mysql)
0 голосов
/ 14 мая 2018

Fluent 3 больше не обеспечивает стандартную сводку, такую ​​как Pivot в Fluent 2. Вместо этого вы должны создать тип, соответствующий Pivot. Для этого в FluentMySQL есть несколько типов помощников.

final class CommunityUser: MySQLPivot {
    // implement the rest of the protocol requirements
    var communityID: Community.ID
    var userID: User.ID
}

Затем используйте CommunityUser вместо Pivot<Community, User>.

...