Haskell Esqueleto - 也许键没有绑定到 LeftOuterJoin
Haskell Esqueleto - Maybe Keys don't bind on LeftOuterJoin
我在使用 maybe 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
连接,但出现以下错误:
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.just
和 E.?.
的简要解释会提高我对 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
,它会换行两次。
我在使用 maybe 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
连接,但出现以下错误:
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.just
和 E.?.
的简要解释会提高我对 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
,它会换行两次。