繁体   English   中英

在Esqueleto中更新具有特定ID的行

[英]Update a row with specific ID in Esqueleto

我可以使用entryId中的entryId更改行的字段,如下所示:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)

但是,一直写它会很烦人。 我希望能够编写如下内容:

  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]

我试图自己写这个助手,但是发现我不知道怎么写^. EntryId ^. EntryId以通用方式(即适用于任何条目类型的方式)。 可能吗? 还是我错过了一些东西,而updateById已经存在updateById?

我绝对不是esqueleto的专家,但我会猜测:

updateById entryId upd = update $ \entry -> do
                           upd entry
                           where_ (entry ^. EntryId ==. val entryId)

应该解决问题。

对于任何Entity^. EntityId ^. EntityId可以写为^. persistIdField ^. persistIdFieldpersistIdField字段是PersistEntity类的方法)。 因此,您的函数可以这样编写:

updateById
  :: (E.PersistEntityBackend val ~ E.SqlBackend,
      MonadIO m, E.PersistEntity val)
  => Key val
  -> (E.SqlExpr (E.Entity val) -> E.SqlQuery a)
  -> E.SqlWriteT m ()
updateById entryId upd = E.update $ \entry -> do
  upd entry
  E.where_ (entry E.^. E.persistIdField ==. E.val entryId)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM