2

イベントのタグ列にタグを含むすべてのイベントをデータベースから選択しようとしています。

Eventtagsは、 Yesod のモデル ファイルで として定義されている列を持つモデルですtags [Tag]。タグは、型を型として格納できるようnewtype Tag = Tag Textにするなど、多くの派生物を持つ単純なモデルです。PersistFieldTagText

タグ列に特定のタグを含むすべてのイベントを選択するクエリを定義したいと考えています。何かのようなもの:

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]

4

0 に答える 0