在yesod中加入多个表

时间:2013-10-31 13:20:19

标签: database haskell yesod

说我有以下型号:

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持久中表达这个?在我看来,持久性只为一个表上的简单查询提供了一个接口。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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