说我有以下型号:
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持久中表达这个?在我看来,持久性只为一个表上的简单查询提供了一个接口。
答案 0 :(得分:2)
Persistent的界面非常简单,通常不足以实现稍微复杂的SQL。 Esqueleto
是一个建立在Persistent数据库机器之上的库,它为您提供了更多类似SQL的Haskell DSL,可以让您表达您正在寻找的内容。
答案 1 :(得分:2)
由于您正在执行与我正在执行的相同的分配,因此我想指向启动框架根目录中的ManyToMany.hs文件。 它包含两个关键函数:joinTables和joinTables3,它们将根据给定的键连接表。在getPaymentsR下的/Handler/Payment.hs中给出了使用后者的示例。使用它,你应该能够进行连接,结果是[(实体收据,实体收据,实体支付)]。