8

教師、学校、学区のデータベース スキーマがあります。TEACHERSテーブルには null 可能な列があり(SCHOOL_ID教師は学校に属している場合と属していない場合があります)、SCHOOLSテーブルには null 可能なDISTRICT_ID列があります (学校は学区に属している場合と属していない場合があります)。

Esqueleto を使用して、それぞれが学校 (ある学校に属している場合) と学区 (学区に属する学校に属している場合) を含む教師のリストが必要です。teacher->school left join の正しい表現を理解するのに少し時間がかかりましたが、最終的には正しい表現になりました。

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 で表現できますか? もしそうなら、どのように?

4

1 に答える 1

3

変更してみる

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

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

それが機能しない場合は、機能するまで、クエリ式の他のコンポーネントを「ただ」平手打ちします。

参考:商用プロジェクトで最近Esqueletoを使用

更新、2016/10/26:

最近、この問題に遭遇しました。結合がnull可能な結果を​​生成しないふりをする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 は a の可能性を期待してPersistNullおり、クエリはうまく機能します。

于 2015-01-26T02:16:50.383 に答える