簡體   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