VaporアプリケーションでFluentと結合する

ガーゴイル

fluentを使用して2つのテーブルを結合する方法を理解するのに苦労しています。本質的に、私はこのSQLコマンドを実行したいと思います。

SELECT p.name, o.amount, o.amount * p.amount total
FROM "OrderPoints" o 
INNER JOIN "Points" p ON o.points_id = p.id 
WHERE order_id = 10831

2つのモデルを次のように設定しました。

final class OrderPoint: Codable, PostgreSQLModel, Content, Migration {
    var id: Int? = nil
    var orderID: Order.ID
    var pointID: Point.ID
    var amount: Double = 0

    var point: Parent<OrderPoint, Point> {
        return parent(\.pointID)
    }
}

final class Point: Codable, PostgreSQLModel, Content, Migration {
    var id: Int? = nil
    var name: String
    var abbrev: String
    var amount: Double
}

そのため、コントローラーで、気になるすべての注文をループします。

// SELECT * FROM orders WHERE "month" = '2018-05-01'
let orders = try Order.query(on: req).filter(\Order.month == month).all()

return orders.flatMap(to: View.self) { orders in
    let content = try orders.map { (order) -> OrderIndexContent in
        let values = try order.orderPoints.query(on: req).all()

これでorder_points現在のIDのすべてのアイテムが取得されると思いますがPointsモデルと結合して残りのクエリを実行する方法がわかりません(つまり、乗算された金額とポイント名を取得します)。

ここに画像の説明を入力してください

  • Orderは複数のOrderPointアイテムがあります。
  • AnがOrderPointあり、単一 Pointのアイテムを。
  • APointは多くのOrderPointアイテムを指す可能性があります。

ですから、流暢とは物事を指すと私が思う方法でOrderPoints、多対多ないので、ピボットではありません

これは正しくありえません。

以下は機能しているようですが、これが大量の余分なSQL呼び出しになるため、これが「正しい」方法である方法はありません。

_ = try! order.orderPoints
              .query(on: req)
              .all()
              .map(to: Void.self) { pointsForOrder in
                  pointsForOrder.forEach { orderPoint in
                      _ = try! orderPoint.point.get(on: req).map(to: Void.self) {
                          print("\(order.id!) \(order.name) \($0.abbrev) \(orderPoint.pointID) = \(orderPoint.amount) = \($0.amount * orderPoint.amount)")
                      }
                  }
          }
ジミー

Point参照されているすべてのをから取得するには、クエリを実行して結合OrderPointするOrder必要があります次に、クエリする順序のフィルタリングにフィルターを追加できます。PointOrderPointOrderPoint

これにより、次のFluentクエリが生成されます。

Point.query(on: req)
    .join(field: \OrderPoint.pointID)
    .filter(OrderPoint.self, \OrderPoint.orderID == order.id!)
    .all()

ただし、このクエリはPointsの配列のみを返すためOrderPoint、Discordに関する説明で指摘したように、デコードする必要があるという情報を見逃してしまいますOrderPoint。幸い、Fluentにはこのための優れたメソッドがあります.alsoDecodeしたがって、最終的なクエリは次のようになります。

Point.query(on: req)
    .join(field: \OrderPoint.pointID)
    .filter(OrderPoint.self, \OrderPoint.orderID == order.id!)
    .alsoDecode(OrderPoint.self)
    .all()

これは、Pointとの両方含むタプルを返しますOrderPoint

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

asp.netWebFormsアプリケーションで結合されたフォーム/ Windows認証をasp.netMVCアプリケーションに移行する

分類Dev

NodeアプリケーションでKnex.jsを使用してANDで内部結合を構築する

分類Dev

Djangoアプリケーションで2つのmysqlテーブルを結合する方法

分類Dev

JavaアプリケーションとAndroidアプリケーションで同じJavaクラスを使用する場合の2つの異なる形式

分類Dev

スタンドアロンアプリケーションでDALとAuthを使用する場合のAttributeError

分類Dev

スプリングブートアプリケーション内にReactWebアプリケーションをjarパッケージと統合する方法

分類Dev

CPPアプリケーションをOpenCLコードと統合する方法

分類Dev

自己完結型アプリケーションで移行を実行する

分類Dev

WebアプリケーションとWebApi、C#でNewtonsoft.Json6.0.0.0と12.0.0.0が競合する

分類Dev

AjaxをDjangoアプリケーションと統合するにはどうすればよいですか?

分類Dev

JavaをTallyアプリケーションと統合する方法

分類Dev

SpringBootを既存のSpringアプリケーションと統合する

分類Dev

SpringBootを既存のSpringアプリケーションと統合する

分類Dev

SwaggerをExpressアプリケーションと統合する方法

分類Dev

iOSアプリケーションからOfficeと統合する

分類Dev

AngularとWebpackをASP.NETMVCアプリケーションに統合する

分類Dev

Express.js-REST-EndpointをMeteorアプリケーションと統合する

分類Dev

AppRoleAssignmentsを「GraphexplorerAPI」のアプリケーションと照合する方法

分類Dev

Node.js を Angular 2 アプリケーションと統合する

分類Dev

既存のアプリケーションをJoomlaと統合する方法は?

分類Dev

認証によるアプリケーションとサーバーの緊密な結合

分類Dev

Quarkusバージョンと競合するアプリケーションGuavalibバージョン

分類Dev

Pythonでコードをアプリケーションに統合する方法

分類Dev

NginxとDockerでアプリケーションをプロキシする方法

分類Dev

Swingアプリケーションでの結合を減らすためのパターンの設計

分類Dev

RESTfulアプリケーションで競合状態を処理する方法

分類Dev

アプリケーション「order」で競合する「order」モデル

分類Dev

複合WPFアプリケーションでResourceDictionariesを共有する方法は?

分類Dev

アプリケーションで多くの結合クエリが必要な場合、ORMを使用する必要があります

Related 関連記事

  1. 1

    asp.netWebFormsアプリケーションで結合されたフォーム/ Windows認証をasp.netMVCアプリケーションに移行する

  2. 2

    NodeアプリケーションでKnex.jsを使用してANDで内部結合を構築する

  3. 3

    Djangoアプリケーションで2つのmysqlテーブルを結合する方法

  4. 4

    JavaアプリケーションとAndroidアプリケーションで同じJavaクラスを使用する場合の2つの異なる形式

  5. 5

    スタンドアロンアプリケーションでDALとAuthを使用する場合のAttributeError

  6. 6

    スプリングブートアプリケーション内にReactWebアプリケーションをjarパッケージと統合する方法

  7. 7

    CPPアプリケーションをOpenCLコードと統合する方法

  8. 8

    自己完結型アプリケーションで移行を実行する

  9. 9

    WebアプリケーションとWebApi、C#でNewtonsoft.Json6.0.0.0と12.0.0.0が競合する

  10. 10

    AjaxをDjangoアプリケーションと統合するにはどうすればよいですか?

  11. 11

    JavaをTallyアプリケーションと統合する方法

  12. 12

    SpringBootを既存のSpringアプリケーションと統合する

  13. 13

    SpringBootを既存のSpringアプリケーションと統合する

  14. 14

    SwaggerをExpressアプリケーションと統合する方法

  15. 15

    iOSアプリケーションからOfficeと統合する

  16. 16

    AngularとWebpackをASP.NETMVCアプリケーションに統合する

  17. 17

    Express.js-REST-EndpointをMeteorアプリケーションと統合する

  18. 18

    AppRoleAssignmentsを「GraphexplorerAPI」のアプリケーションと照合する方法

  19. 19

    Node.js を Angular 2 アプリケーションと統合する

  20. 20

    既存のアプリケーションをJoomlaと統合する方法は?

  21. 21

    認証によるアプリケーションとサーバーの緊密な結合

  22. 22

    Quarkusバージョンと競合するアプリケーションGuavalibバージョン

  23. 23

    Pythonでコードをアプリケーションに統合する方法

  24. 24

    NginxとDockerでアプリケーションをプロキシする方法

  25. 25

    Swingアプリケーションでの結合を減らすためのパターンの設計

  26. 26

    RESTfulアプリケーションで競合状態を処理する方法

  27. 27

    アプリケーション「order」で競合する「order」モデル

  28. 28

    複合WPFアプリケーションでResourceDictionariesを共有する方法は?

  29. 29

    アプリケーションで多くの結合クエリが必要な場合、ORMを使用する必要があります

ホットタグ

アーカイブ