如何使用Esqueleto进行“SELECT ... IN(SELECT ...)”?

时间:2017-05-28 19:35:28

标签: haskell persistent servant esqueleto

考虑到以下两个模型和let celloffset = UserDefaults.standard.integer(forKey: "celloffset") if celloffset != 0{ let index = IndexPath(item: celloffset, section: 0) self.tableView.scrollToRow(at: index, at: UITableViewScrollPosition.middle, animated: false)} 请求,我想基于其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

但是,鉴于我想维护Haskell和SQL之间的类型安全,我想使用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 = ?)" 重写它。这是我正在努力的部分。通过阅读文档,sub_select似乎是工作的工具。这就是我所拥有的:

esqueleto

我也注意到in_ operator,但我无法弄清楚如何使用它,也不知道它是否比sub_select更合适。

我错过了什么?语法是否正确?感谢。

1 个答案:

答案 0 :(得分: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