[英]Can't write double left join using Esqueleto
我有一个教师,学校和地区的数据库模式。 该TEACHERS
表有一个可为空的SCHOOL_ID
列(老师可能会或可能不会属于一所学校)和SCHOOLS
表有一个可为空DISTRICT_ID
柱(一所学校可能会或可能不属于区)。
使用Esqueleto,我想要一个教师名单,每个教师都有一所学校(如果他们属于一所学校)和一个学区(如果他们属于属于某个学区的学校)。 花了一点时间才找出适合老师的正确表达 - >学校左连接,但我最终做对了:
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表示这种双连接吗? 如果是这样,怎么样?
尝试改变
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)
。
现在Persistent期望PersistNull
的可能性,并且查询对我来说很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.