如何查询Haskell Esqueleto

时间:2017-01-24 04:29:41

标签: postgresql haskell yesod esqueleto

我尝试从数据库中选择包含“事件”标记列中标记的所有事件。

Event是一个列tags的模型,在Yesod的模型文件中定义为tags [Tag]。标记是一个简单newtype Tag = Tag Text的模型,其中包含许多衍生内容,其中PersistField应允许将Tag类型存储为Text类型。

我想定义一个查询,在其tags列中选择包含给定标记的所有事件。类似的东西:

getEventsByTag :: Tag -> Handler Value
getEventsByTag tag = do
  events <- runDB findEvents :: Handler [Entity Event]
  return $ object ["events" ==. events]
 where
  findEvents =
    select $
      from $ \event -> do
        where_ $ (event ^. EventTags) `contains` (val tag)
        return event

我不确定如何做的部分是contains功能。由于Persistent将数组存储为postgres中的varchars,因此我似乎不太可能使用任何postgres数组函数。在这种情况下,我可以使用like。我实际上能够在postgres中使用此查询获得我想要的结果:select * from events where tags like '%"tag"%';但我不确定如何将其转换为Esqueleto的语言。我尝试使用like函数,但它要求两个参数都是我SqlString派生的Tag实例,但却无法确定如何在不重叠实例的情况下导出[Tag]

0 个答案:

没有答案