3

次の 2 つのモデルとGET /articles/:slug/commentsリクエストを考慮して、記事に属するコメントをその に基づいて取得したいと考えていますslug

Article json sql=articles
    slug        Slug
    title       Text
    description Text
    body        Text
    createdAt   UTCTime default=now()
    updatedAt   UTCTime Maybe default=NULL
    userId      UserId
    UniqueSlug  slug

Comment json sql=comments
    body      Text
    createdAt UTCTime default=now()
    updatedAt UTCTime Maybe default=NULL
    articleId ArticleId
    userId    UserId

永続rawSql化を使用すると、次のようにこれを実現できます

getCommentsForArticle :: Slug -> App (Cmts [Entity Comment])
getCommentsForArticle slug = do
    comments <- runDb $ rawSql stm [toPersistValue slug]
    return (Cmts comments)
        where stm = "SELECT ?? FROM comments \
                    \WHERE article_id IN (\
                        \SELECT id FROM articles WHERE slug = ?)"

しかし、Haskell と SQL の間で型の安全性を維持したいので、これをesqueleto. これは私が苦労している部分です。ドキュメントを読むと、sub_selectがその仕事のツールのようです。ここに私が持っているものがあります:

getCommentsForArticle :: Slug -> App (Cmts [Comment])
getCommentsForArticle slug = do
    comments <- E.select $
        E.from $ \cmts -> do
            let subQuery =
                    E.from $ \arts -> do
                        E.where_ $ arts ^. ArticleSlug ==. E.val slug
                        return (arts ^. ArticleId)
            E.where_ $ cmts ^. CommentArticleId ==. E.sub_select subQuery
            return cmts
    return $ Cmts comments

in_ operatorにも気付きましたが、使い方がわかりませんし、 sub_selectよりも適切かどうかもわかりません。

私は何が欠けていますか?構文は正しいですか?ありがとう。

4

1 に答える 1

0

あなたはこのようなものが欲しいでしょう

getCommentsForArticle slug = do
  c <- select $ from $ \cmts -> do
         let a = subList_select $ from $ \arts -> do
                 where_ $ arts ^. ArticleSlug ==. val slug
                 return $ arts ^. ArticleId
         where_ $ cmts ^. CommentArticleId `in_` a
         return cmts
  return $ Cmts c
于 2018-01-11T09:26:07.697 に答える