2
웹 페이지에 항목 목록을 표시하고 관련 테이블과 관련된 세부 정보 (다 대일 관계 포함)를 표시하고 싶습니다. Yesod에서 나는 이것을 어떻게합니까? 기본 스캐 폴딩을 사용하고 있습니다. 결과적으로 runDB
은 WidgetT
컨텍스트 내에서 —으로 중첩 될 수 없기 때문에 생각합니다. 햄릿의 목록에서 별도의 쿼리의 "세부 정보"를 결합하는 방법은 무엇입니까?
featuresAssociatedWith
를 정의하는 방법은 다음과 같습니다
<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] []
hamlet 코드에서 db lookup을 유지하는 것을 존중하지만 위젯에서 발생하는 것으로 제한된다는 것이 이상하다는 것을 알게되었습니다. 그 외에도 "Yesod"또는 "persistent"에서이 작업을 수행하는 "마법의"방법이 있는지 궁금합니다. 나는 결국 [this] (http://stackoverflow.com/a/9389550/712526)을 끝낼 것이다. 시간 내 주셔서 감사합니다. – jpaugh
나는 햄릿 안의 위젯에서 할 수 없다고 말하지 않았다. Handler 액션을 위젯 액션으로 변환하려면 [handlerToWidget] (http://hackage.haskell.org/package/yesod-core-1.2.19.2/docs/Yesod-Core-Widget.html#v:handlerToWidget)을 사용할 수 있습니다. . –