在 Esqueleto 中更新具有特定 ID 的行
Update a row with specific ID in Esqueleto
我可以在 Esqueleto 中使用 entryId
更改一行的字段,如下所示:
update $ \entry -> do
set entry [ EntryFoo =. val bar ]
where_ (entry ^. EntryId ==. val entryId)
但是,一直写下去会很烦人。我希望能够写出这样的东西:
updateById entryId $ \entry ->
set entry [ EntryFoo =. val bar ]
我尝试自己编写这个助手,但发现我不知道如何以通用方式(即适用于任何条目类型的方式)编写 ^. EntryId
。可能吗?还是我遗漏了什么,updateById
已经存在于 Esqueleto 中?
我绝对不是 esqueleto 方面的专家,但我猜:
updateById entryId upd = update $ \entry -> do
upd entry
where_ (entry ^. EntryId ==. val entryId)
应该可以解决问题。
对于任何Entity
,^. EntityId
可以写成^. persistIdField
(persistIdField
字段是PersistEntity
class的一个方法).因此,您的函数可以这样写:
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)
我可以在 Esqueleto 中使用 entryId
更改一行的字段,如下所示:
update $ \entry -> do
set entry [ EntryFoo =. val bar ]
where_ (entry ^. EntryId ==. val entryId)
但是,一直写下去会很烦人。我希望能够写出这样的东西:
updateById entryId $ \entry ->
set entry [ EntryFoo =. val bar ]
我尝试自己编写这个助手,但发现我不知道如何以通用方式(即适用于任何条目类型的方式)编写 ^. EntryId
。可能吗?还是我遗漏了什么,updateById
已经存在于 Esqueleto 中?
我绝对不是 esqueleto 方面的专家,但我猜:
updateById entryId upd = update $ \entry -> do
upd entry
where_ (entry ^. EntryId ==. val entryId)
应该可以解决问题。
对于任何Entity
,^. EntityId
可以写成^. persistIdField
(persistIdField
字段是PersistEntity
class的一个方法).因此,您的函数可以这样写:
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)