簡體   English   中英

Haskell Esqueleto-也許鍵不綁定到LeftOuterJoin

[英]Haskell Esqueleto - Maybe Keys don't bind on LeftOuterJoin

在使用maybe foreign keymaybe foreign key時,我遇到了一些麻煩。

我的模特:

OrderItem
  productSnapshot ProductSnapshotId

ProductFlow
  productInstance ProductInstanceId
  orderItem OrderItemId Maybe

ProductSnapshot
  productInstance ProductInstanceId

ProductInstance
  code Text

和我的加入:

type Entities = [(Entity OrderItem, Entity ProductSnapshot, Entity ProductInstance, Maybe (Entity ProductFlow))]

loadEntities :: OrderItemId -> Handler Entities
loadEntities oiId = runDB
  $ E.select
  $ E.from $ \(oi `E.InnerJoin` ps `E.InnerJoin` pi `E.LeftOuterJoin` pf) -> do
    E.on $ pf E.?. ProductFlowOrderItem E.==. E.just (oi ^. OrderItemId)
    E.on $ pi ^. ProductInstanceId E.==. ps ^. ProductSnapshotProductInstance
    E.on $ ps ^. ProductSnapshotId E.==. oi ^. OrderItemProductSnapshot
    E.where_ (oi ^. OrderItemId E.==. E.val oiId)
    return (oi, ps, pi, pf)

我嘗試了Esqueleto顯示的Esqueleto連接,但是出現以下錯誤:

Couldn't match type ‘Key OrderItem’ with ‘Maybe (Key OrderItem)’
    Expected type: EntityField OrderItem (Maybe (Key OrderItem))
      Actual type: EntityField OrderItem (Key OrderItem)
    In the second argument of ‘(^.)’, namely ‘OrderItemId’
    In the first argument of ‘E.just’, namely ‘(oi ^. OrderItemId)’

我認為這是因為我使用的是外鍵。 我嘗試了其他方法,但遇到了奇怪的類型錯誤。 我想我不太了解這些連接的工作原理,因此請簡要介紹一下E.^. E.justE.?. 會提高我的Esqueleto使用率。

我設法了解了問題並自己解決了,而不是

E.on $ pf E.?. ProductFlowOrderItem E.==. E.just (oi ^. OrderItemId)

用這個

E.on $ pf E.?. ProductFlowOrderItem E.==. (E.just . E.just) (oi ^. OrderItemId)

必須使類型匹配,因為我們使用的是E.?. 使用已經存在的Maybe值,因此,我們必須將右側Maybe (Maybe AType) ,否則將是錯誤的,並且我只使用E.just . E.just E.just . E.just將包裝兩次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM