gpt4 book ai didi

haskell - 从 Esqueleto `Maybe (Entity a)` 返回 `LeftOuterJoin`

转载 作者:行者123 更新时间:2023-12-02 13:39:57 25 4
gpt4 key购买 nike

来自脚手架站点中人为的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"

有没有办法将实体 list 投影为也许(实体 list )

最佳答案

这可能被标记为 Outer Joins with Esqueleto 的重复项;但区别在于投影。

在处理任何外连接时,所有可能返回 null 的表都应该使用 ?. 语法完成所有投影。这将迫使表的实体变成 Maybe (Entity a) 所以上面的解决方案是

selectContainerSlots containerKey = do
stuff <- select $ from $ \(cs `LeftOuterJoin` i) -> do
on $ cs ^. ContainerSlotItem ==. i ?. InventoryId
where_ $ cs ^. ContainerSlotContainer ==. val containerKey
return (cs, i)
return $ uncurry buildStuff <$> stuff

此外,如果有多个表被链接;例如

select $ from $ \(cs `LeftOuterJoin` (i `InnerJoin` is)) -> do

然后,两者 iis(库存 SKU 表)应使用该语法进行投影:

  on $ i ?. InventoryId ==. is ?. InventorySkuItem
on $ cs ^. ContainerSlotItem ==. i ?. InventoryId

关于haskell - 从 Esqueleto `Maybe (Entity a)` 返回 `LeftOuterJoin`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com