0

假设我有以下型号:

User
    ident Text
    password Text Maybe
    UniqueUser ident
    deriving Typeable
Payment
    timestamp UTCTime
    from UserId
    to UserId
    receiptId ReceiptId
ReceiptUser                     
    userId UserId
    receiptId ReceiptId
Receipt
    owner UserId
    money Int

我想执行这样的查询:

SELECT ReceiptUser.UserId, Receipt.ReceiptOwner, Receipt.Id, Receipt.Price
FROM ReceiptUser, Receipt, Payment
WHERE ReceiptUser.ReceiptId == Receipt.Id
      AND NOT (Payment.ReceiptId == Receipt.Id AND Payment.From == ReceiptUser.UserId AND Payment.To == Receipt.Owner)

应该是找到所有还没有给其他用户付款的用户,加上相应的收据信息。

我怎么能用 yesod 持久表达这一点?在我看来,persistent 只为一个表上的简单查询提供了一个接口。

4

2 回答 2

2

Persistent 的接口非常简单,通常不足以实现哪怕是稍微复杂的 SQL。Esqueleto是一个建立在 Persistent 数据库机器之上的库,它为您提供了一个更像 SQL 的 Haskell DSL,它可以让您表达您正在寻找的内容。

于 2013-10-31T13:28:20.443 回答
2

由于您正在执行与我相同的任务,因此我想将您指向起始框架根目录中的 ManyToMany.hs 文件。它包含两个关键函数:joinTables 和 joinTables3,它们将根据给定的键连接表。在 getPaymentsR 下的 /Handler/Payment.hs 中给出了使用后者的示例。使用它,您应该能够进行连接,结果是 [(Entity ReceiptUser, Entity Receipt, Entity Payment)]。

于 2013-11-02T14:43:29.393 回答