在蒸气3中建立亲子关系

时间:2018-10-30 03:05:44

标签: swift parent-child vapor

我正在使用Vapor 3尝试创建一个示例项目,其中我有一个菜,即父母,而对菜的评论,即孩子。我所见过的所有教程对于如何创建关系还不太清楚,或者他们正猜想使用leaf来建立关系。我不想为此使用叶子,我只想能够在给我ID的时候显示所有关于菜式的评论,而且看来它与水蒸气2有所不同。 我的2个模型是Dish and Review Dish.swift:父母,

import Foundation
import Vapor
import FluentSQLite

final class Dish: Content {
    var id: Int?
    var name: String
    var course: String
    var price: Double
    var imageURL: String
    var description: String

    init(name: String, course: String, price: Double, imageURL: String, description: String) {
        self.name = name
        self.course = course
        self.price = price
        self.imageURL = imageURL
        self.description = description

    }

}

extension Dish {
    var reviews: Children<Dish, Review> {
        return children(\.dishId)
    }
}

extension Dish: Parameter { }

extension Dish: SQLiteModel {
    static let entity: String = "Dishes"
}

extension Dish: Migration { }

Review.swift,孩子,

import Foundation
import Vapor
import FluentSQLite

final class Review: Content {

    var id: Int?
    var title: String
    var body: String
    var dishId: Dish.ID

    init(title: String, body: String, dishId: Dish.ID) {
        self.title = title
        self.body = body
        self.dishId = dishId
    }

}

extension Review {
    var dish: Parent<Review, Dish> {
        return parent(\.dishId)
    }
}

extension Review: Migration { }

extension Review: SQLiteModel {
    static let entity: String = "Reviews"
}

extension Review: Parameter { }

Dish的控制器DishController

import Foundation
import Vapor
import FluentSQLite

class DishesController: RouteCollection {

    func boot(router: Router) throws {
        let dishesRoutes = router.grouped("api/dishes")
        dishesRoutes.get("/", use: getAll)
        dishesRoutes.get(Dish.parameter, use: getById)
        dishesRoutes.post(Dish.self, at: "/", use: createDish)
        dishesRoutes.delete(Dish.parameter, use: deleteDish)
    }

    func deleteDish(req: Request) throws -> Future<Dish> {
        return try req.parameters.next(Dish.self).delete(on: req)
    }


    func createDish(req: Request, dish: Dish) -> Future<Dish> {
        return dish.save(on: req)
    }

    func getAll(req: Request) -> Future<[Dish]> {
        return Dish.query(on: req).all()
    }

    func getById(req: Request) throws -> Future<Dish> {
        return try req.parameters.next(Dish.self)
    }


}

和评论控制器。 ReviewController,

import Foundation
import Vapor
import FluentSQLite

class ReviewController: RouteCollection {
    func boot(router: Router) throws {
        let reviewRoutes = router.grouped("api/reviews")


        reviewRoutes.get("/", use: getAll)
        reviewRoutes.get(Review.parameter, use: getById)
        reviewRoutes.post(Review.self, at: "/", use: createReview)
        reviewRoutes.delete(Review.parameter, use: deleteReview)

    }


    func deleteReview(req: Request) throws -> Future<Review> {
        return try req.parameters.next(Review.self).delete(on: req)
    }

    func createReview(req: Request, review: Review) -> Future<Review> {
        return review.save(on: req)
    }


    func getAll(req: Request) -> Future<[Review]> {
        return Review.query(on: req).all()
    }

    func getById(req: Request) throws -> Future<Review> {
        return try req.parameters.next(Review.self)
    }
}

这是routes.swift,

import Vapor


/// Register your application's routes here.
public func routes(_ router: Router) throws {


    router.get("/reviews", Dish.parameter,"dish") { request -> Future<Dish> in

        return try request.parameters.next(Review.self).flatMap(to: Dish.self) { review in

            return review.dish.get(on: request)
        }
    }


    let dishesController = DishesController()
    try router.register(collection: dishesController)
    let reviewController = ReviewController()
    try router.register(collection: reviewController)

}

我只想要一个简单的一对多关系,其中一个菜可以有很多评论,但是当我使用邮递员尝试访问特定菜的评论时,我得到的只是一个错误。我知道我在邮递员中使用了正确的语法,因为我可以很好地使用来自控制器的所有其他请求,而对于关系则完全不使用。请告诉我我所缺少的,因为我对自己做错的事情感到困惑。如果还有其他需要补充的地方,请询问。 非常感谢

1 个答案:

答案 0 :(得分:1)

如果要访问特定菜肴的所有评论,请尝试以下代码。

$('.myDiv').click(function(e){
    $('.myDiv').not(this).next('.child').removeClass('test');
    $(this).next('.child').toggleClass('test');     
});

现在在邮递员中,传递以下菜品ID:

  

获取:http://localhost:8080/dish/1/reviews