如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?
Posted
技术标签:
【中文标题】如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?【英文标题】:How to combine "details" from a separate query in a list in Hamlet? 【发布时间】:2014-09-01 00:54:52 【问题描述】:我想显示网页中的项目列表,以及来自单独表格(具有多对一关系)的相关详细信息。我如何在 Yesod 中做到这一点?我正在使用默认的脚手架。结果是runDB
不能嵌套在WidgetT
上下文中——至少我是这么认为的。
为了更具体,我如何定义函数 featuresAssociatedWith
以在以下 hamlet 代码中使用:
<h2> Cars
$forall Entity carId car <- carList
<div class="car-item">
<h3> #carYear car #carMake car #carModel car
<ul>
$forall feature <- featuresAssociatedWith carId
<li> #feature
鉴于以下模型:
Car
make Text
model Text
year Int
CarFeature
car CarId
text Text
UniqueCF car text
这是当前的处理函数
getCarListR :: Handler html
getCarListR = do
carList <- runDB $ selectList [] [Asc CarOrder]
liftIO $ print $ length carList
defaultLayout $ do
setTitle "Cars"
$(widgetFile "carList")
以这种方式在小部件中嵌入runDB
查询似乎是最自然的,但同样,这是不可能的:
featuresAssocWith :: CarId -> [Entity CarFeature]
featuresAssocWith carID = selectList [CarFeatureCar ==. carID] []
【问题讨论】:
【参考方案1】:Hamlet 旨在不允许您在其中执行诸如数据库查询之类的操作。相反,您需要在 hamlet 之外执行查询,然后传入汽车信息元组列表以及关联表中的数据。
【讨论】:
虽然我尊重将 db 查找排除在 hamlet 代码之外,但我觉得奇怪的是它根本不会出现在小部件中。除此之外,我只是想知道在“Yesod”或“persistent”中是否有一种“神奇”的方式来做到这一点。我现在最终会做this。感谢您的宝贵时间。 我没有说你不能在 Widget 中做到这一点,只是不能在 Hamlet 中做到。您可以使用handlerToWidget 将任何 Handler 操作转换为 Widget 操作。以上是关于如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?的主要内容,如果未能解决你的问题,请参考以下文章