イベントのタグ列にタグを含むすべてのイベントをデータベースから選択しようとしています。
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
関数です。Persistent は配列を varchar として postgres に格納するため、postgres 配列関数を使用できる可能性は低いと思われます。その場合、私はlike
. postgres でこのクエリを使用して、実際に必要な結果を得ることができました。select * from events where tags like '%"tag"%';
しかし、これを Esqueleto の言語に翻訳する方法がわかりません。関数を使用してみましたlike
が、両方の引数を派生させたインスタンスにする必要がありますが、インスタンスSqlString
を重複させずに派生Tag
させる方法を理解するのに苦労しました。[Tag]