如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?

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&nbsp;#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 操作。

以上是关于如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?的主要内容,如果未能解决你的问题,请参考以下文章

如果我在 Java 中查询,如何组合来自 mssql 数据库和 mysql 数据库的数据?

如何将查询结果保存到单独的表中?

如何显示来自相关子查询的表的两个详细信息。 #mysql

将来自同一表的单独查询组合为单独的列

如何在 maximo 中查询邮件跟踪详细信息

如何使用 javascript 在 couchdb 中使用多个组合键进行查询,而无需为每个组合编写单独的视图?