2013-04-25 5 views
8

그래서 my/config/models는 다음과 같이 보입니다. Persistent Yesod에서 many-to-many를 수행하는 가장 좋은 방법은 무엇입니까?

Person 
    name Text 
Car 
    name Text 
PersonCar 
    personId PersionId eq 
    carId CarId eq 
    UniquePersonCar personId carId 

데이터베이스에 입력 각각 Person "Superman" Car "SUV" Car "Ford" Person "Batman"를 가정하자.

현재 처리기에서 연결하려면이 작업을 수행하고 있습니다.

runDB $ do 
    person <- selectFirst [PersonName ==. "Batman"] [] 
    car <- selectFirst [Carname ==. "SUV"] [] 
    let Entity personId _ = case person of 
          Just info -> infor 
          Nothing -> error "no such Person" 
    let Entity carId _ = case car of 
          Just info -> infor 
          Nothing -> error "no such Car" 
    _ <- insert $ PersonCar personId carId 

더 쉬운 방법이 있나요? 그러한 표현을하기위한 관습이 있습니까?

답변

1

아니요, 현재이 종류의 쿼리에 대한 속칭이 없습니다 (적어도 생각할 수 있습니다).

1

오류로 호출하면 앱이 중지됩니다. logError이 더 좋을 수 있습니다. 나는 핸들러에서 그것을하고 있어요

import Data.Conduit 
import qualified Data.Conduit.List as DCL 

runDB $ do 
    mbPersonId <- runResourceT $ selectKeys [PersonName ==. "Batman"] [] $$ DCL.head 
    mbCarId <- runResourceT $ selectKeys [CarName ==. "SUV"] [] $$ DCL.head 

    case (mbPersonId, mbCarId) of 
     (Just personId, Just carId) -> do 
       _ <- insert $ PersonCar personId carId 
       return() 

     _ -> $(logError) "error looking for Batman and SUV" 
+0

, 나에게 오류를 분석 아이디어를주고 :

이 짧은입니까? 는'postFromR :: 처리기 RepHtml postFormR FormSuccess의 고해상도의 경우 결과를 수행 =이 -> _ <- runDB $ 삽입 $ PersonCar persionId carId이 _ -> $ (logError) "오류"' – HHC

+0

@HHC, 내가 추가 한 그 다음에 리턴 표현식이 필요한 삽입 라인 주위를 차단하십시오. yesod 설치로 테스트 한 후 코드를 다시 잡으십시오. 모델 이름을 확인하십시오 (PersonId 대신 PesionId, PersonCar 대신 PesonCar). –