我正在尝试使用 Haskell 中的 Groundhog 创建多对多表,如果我去掉所有其他逻辑,它基本上看起来像这样:
data FooRow = FooRow {
fooRowUUID :: UUID
}
deriving instance Show FooRow
data BarRow = BarRow {
barRowUUID :: UUID
}
deriving instance Show BarRow
data FooToBarRow = FooToBarRow {
fooToBarRowUUID :: UUID,
fooToBarRowFoo :: DefaultKey FooRow,
fooToBarRowBar :: DefaultKey BarRow
}
deriving instance Show FooToBarRow
现在,尝试定义操作,我可以很好地获取和插入所有这些记录,但是我不确定如何从拥有 FooRow 及其 ID,然后通过以下方式获取所有相关的 BarRows多对多表。现在我玩过这样的东西:
getBarsForFoo fooID = do
barKeys <- project
(FooToBarRowBarField)
(FooToBarRowFooField ==. (Foo_FooKey fooID))
select $ (BarRowUUIDField `in_` barKeys)
然而,这并没有进行类型检查,并出现错误:
Couldn't match type 'UUID' with 'BarRow'
仅使用 putStrLn 检查项目的结果,我可以看到 barKeys
的类型是:
[Bar_BarKey UUID]
但我不太明白如何在我的查询中使用它。我在 Groundhog 文档中没有看到任何这样的例子,所以我希望有人能够在这里让我走上正确的道路。
最佳答案
我很确定有更有效的方法来解决这个问题(这种方法会产生大量的底层查询),但这至少暂时完成了工作。
getBarsForFoo fooID = do
barKeys <- project
(FooToBarRowBarField)
(FooToBarRowFooField ==. (Foo_FooKey fooID))
q <- mapM (getBy) barKeys
return (catMaybes q :: [BarRow])
关于sql - 在 Groundhog Haskell 中通过投影键选择行的理想方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355709/