我尝试从数据库中选择包含“事件”标记列中标记的所有事件。
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]