2015-01-24 9 views
7

저는 교사, 학교 및 학구가있는 데이터베이스 스키마가 있습니다. TEACHERS 테이블에는 null 가능 SCHOOL_ID 열 (교사가 학교에 소속되거나 소속되지 않을 수도 있음)이 있고 SCHOOLS 테이블에는 null 허용 DISTRICT_ID 열이 있습니다 (학교는 교육구에 소속되어 있거나 소속되어 있지 않을 수도 있음).Esqueleto를 사용하여 이중 왼쪽 조인을 쓸 수 없습니다.

Esqueleto를 사용하여 각 학교 (소속이있는 경우)와 지구 (소속 지역에 속한 학교에 속한 경우)가있는 교사 목록이 필요합니다. 그것은 학교가 참여 왼쪽> 바로 teacher-에 적합한 표현을 알아 내기 위해 잠시 동안을했다,하지만 난 결국 바로 그것을 가지고 : 나는 또 다른 왼쪽을 추가하는 시도

select $ 
from $ \(teacher `LeftOuterJoin` school) -> do 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school) 

는 유사한 표현을 사용 DISTRICTS에 가입 :

select $ 
from $ \(teacher `LeftOuterJoin` school `LeftOuterJoin` district) -> do 
    on (school ^. SchoolDistrictId ==. district ?. DistrictId) 
    on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 
    return (teacher, school, district) 

하지만 오류 얻을 :

Couldn't match type ‘Entity School’ with ‘Maybe (Entity School)’ 
Expected type: SqlExpr (Maybe (Entity School)) 
    Actual type: SqlExpr (Entity School) 
In the first argument of ‘(?.)’, namely ‘school’ 
In the second argument of ‘(==.)’, namely ‘school ?. SchoolId’ 

이 두 배는 Esqueleto를 사용하여

을 표현할 수 가입 할 수 있습니까? 그렇다면 어떻게?

+0

이 라이브러리는 모릅니다. 모든 것이 복잡해 보이지만, SQL 작업과 동기화하기 위해 '어쩌면'작업을 수행해야하는 것처럼 보입니다. 또는 다른 방법으로 '라운드. 나는 몰라. – dfeuer

답변

1

한번에 변경

on (teacher ^. TeacherSchoolId ==. school ?. SchoolId) 

그것이 작동 할 때까지 쿼리 식의 다른 구성 요소에 '단지', 때리고 작동하지 않는 경우

on (teacher ^. TeacherSchoolId ==. just (school ?. SchoolId)) 

에.

참조 : 상업 프로젝트

업데이트에 최근 Esqueleto 사용 2016년 10월 26일는 :

나는 최근에이 문제가 발생했습니다. 나는 Esqueleto의 의지와 상호 작용하여 영속성이없는 결과를 생성하지 않는다고 주장하는 지속적인 직렬화 문제라고 생각합니다.

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ^. PersonExtraPerson) ==. (person ^. PersonId)) 

에 :

person `LeftOuterJoin` 
    personExtra 
) -> do 
    on ((personExtra ?. PersonExtraPerson) ==. just (person ^. PersonId)) 

가 나는 또한 Entity PersonExtra에서 Maybe (Entity PersonExtra) 내 쿼리의 반환 형식을 변경

는 최근에서 쿼리의 조각을 변경했습니다.

이제 영구적으로 PersistNull의 가능성을 예상하고 쿼리가 정상적으로 작동합니다.

+0

두 개의'==. '연산자에 대한 네 개의 인수 각각에 대해'just'가없는 16 개의 모든 조합을 시도했습니다. 그 중 아무 것도 컴파일 가능한 코드가 아닙니다. – Sean

+0

@Sean '?'이 (가) 무엇입니까? – bitemyapp

+0

Esqueleto 문서에 따르면 "Maybe (엔터티 a)의 필드를 투영하는 것"입니다. – Sean