繁体   English   中英

无法使用Esqueleto编写双左连接

[英]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 PersonExtraMaybe (Entity PersonExtra)

现在Persistent期望PersistNull的可能性,并且查询对我来说很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM