2

我正在尝试从数据库中选择包含事件标签列中的标签的所有事件。

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

我想定义一个查询,该查询选择在其标签列中包含给定标签的所有事件。就像是:

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功能。我似乎不太可能使用任何 postgres 数组函数,因为 Persistent 将数组作为 varchars 存储在 postgres 中。在这种情况下,我可以看中like. 我实际上能够在 postgres 中通过这个查询得到我想要的结果:select * from events where tags like '%"tag"%';但我不知道如何将它翻译成 Esqueleto 的语言。我尝试使用该like函数,但它要求两个参数都是SqlString我进行Tag派生的实例,但无法弄清楚如何在[Tag]不重叠实例的情况下进行派生。

4

0 回答 0