我正在尝试从数据库中选择包含事件标签列中的标签的所有事件。
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]
不重叠实例的情况下进行派生。