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

Haskell 在Esqueleto中更新具有特定ID的行,haskell,persistent,esqueleto,Haskell,Persistent,Esqueleto,在Esqueleto中,我可以使用entryId将行的字段更改为: update $ \entry -> do set entry [ EntryFoo =. val bar ] where_ (entry ^. EntryId ==. val entryId) updateById entryId $ \entry -> set entry [ EntryFoo =. val bar ] updateById :: (E.PersistEnt

在Esqueleto中,我可以使用
entryId
将行的字段更改为:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)
  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]
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)
然而,一直写下去会让人讨厌。我希望能够写出这样的东西:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)
  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]
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)

我试图自己编写这个助手,但发现我不知道如何编写
^。EntryId
以通用方式(即适用于任何条目类型的方式)。可能吗?或者我遗漏了什么,并且Esqueleto中已经存在
updateById

我肯定不是Esqueleto方面的专家,但我猜:

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

应该可以解决这个问题。

我肯定不是埃斯奎莱托方面的专家,但我猜:

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

应该可以解决问题。

对于任何
实体
^。EntityId
可以写成
^。persistIdField
persistIdField
字段是
PersistEntity
类的一种方法)。因此,您的函数可以这样编写:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)
  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]
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)

对于任何
实体
^。EntityId
可以写成
^。persistIdField
persistIdField
字段是
PersistEntity
类的一种方法)。因此,您的函数可以这样编写:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)
  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]
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)

当然,它解决了一个特定表(
Entry
)的问题,但我想要一个适用于任何表的解决方案。也就是说,我需要
updateById::Key a->
,而您的函数是
updateById::Key Entry->
。当然,它解决了一个特定表的问题(
Entry
),但我需要一个适用于任何表的解决方案。也就是说,我需要
updateById::Key a->
,而您的函数是
updateById::Key Entry->