【发布时间】:2017-04-02 01:49:38
【问题描述】:
来自一个人为的config/models 脚手架网站:
Inventory
name Text
description Text
Container
name Text
ContainerSlot
container ContainerId
item InventoryId Maybe
现在,使用 Esqueleto,我想使用 LeftOuterJoin 获取容器中的插槽,如果尚未分配实际库存,则实际库存为空。
selectContainerSlots containerKey = do
stuff <- select $ from $ \(cs `LeftOuterJoin` i) -> do
on $ cs ^. ContainerSlotItem ==. just (i ^. InventoryId)
where_ $ cs ^. ContainerSlotContainer ==. val containerKey
return (cs, i)
return $ uncurry buildStuff <$> stuff
由于联接的“外部”性质,我预计 buildStuff 需要以下签名:
buildStuff :: Entity ContainerSlot -> Maybe (Entity Inventory) -> Result
但发现它需要以下内容:
buildStuff :: Entity ContainerSlot -> Entity Inventory -> Result
当Inventory 字段填充有NULL 值时,这会导致运行时失败。
PersistMarshalError "field id: int64 Expected Integer, received: PersistNull"
有没有办法将Entity Inventory 投影为Maybe (Entity Inventory)?
【问题讨论】:
标签: haskell yesod persistent esqueleto