2014-09-01 48 views
2

我想显示网页中的项目列表,以及来自单独表格(具有多对一关系)的相关详细信息。我如何在Yesod中做到这一点?我正在使用默认的脚手架。结果是runDB不能嵌套在WidgetT上下文  —左右,我想。如何结合哈姆雷特列表中单独查询中的“细节”?

为了使这更具体,我怎么定义函数featuresAssociatedWith在下面的村庄代码使用方法:

<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") 

嵌入似乎是最自然的查询在Widget的这种方式,但同样,这是不可能的:

featuresAssocWith :: CarId -> [Entity CarFeature] 
featuresAssocWith carID = selectList [CarFeatureCar ==. carID] [] 

回答

2

哈姆雷特的设计不会让你执行这里面像数据库查询的操作。相反,您需要在哈姆雷特之外执行查询,然后将汽车信息的元组列表与相关表中的数据一起传递。

+0

虽然我尊重dblet查找的哈姆雷特代码,但我觉得奇怪的是它会被限制在小部件中发生。除此之外,我只是想知道在“Yesod”或“persistent”中是否有一种“神奇”的方式来做到这一点。现在我将最终做[this](http://stackoverflow.com/a/9389550/712526)。 谢谢你的时间。 – jpaugh 2014-09-02 23:07:07

+1

我没有说你不能在Widget中做,只是不在哈姆雷特内部。您可以使用[handlerToWidget](http://hackage.haskell.org/package/yesod-core-1.2.19.2/docs/Yesod-Core-Widget.html#v:handlerToWidget)将任何Handler操作转换为Widget操作。 – 2014-09-03 05:02:23