1

我可以entryId像这样在 Esqueleto 中更改一行的字段:

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

但是,一直写它会很烦人。我希望能够写出这样的东西:

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

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

4

2 回答 2

0

对于 any Entity^. EntityId可以写成^. 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)
于 2017-11-05T20:39:07.950 回答
0

我绝对不是 esqueleto 方面的专家,但我猜:

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

应该解决问题。

于 2017-10-03T20:13:48.903 回答