2014-09-01 58 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