次の 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よりも適切かどうかもわかりません。
私は何が欠けていますか?構文は正しいですか?ありがとう。