0

私はページ分割されたリソースを実行しています。これには、SQL 用語で既に設計した内部選択が必要です。次の構造があります。

select * 
  from (
    select w.*, d.distance
      from `Work` w
      inner join AdrDistance d on d.nhood2 = w.nhood
    where d.nhood1 = 1 -- this will be a variable
    order by d.distance
    limit 0, 10 -- this will be pagination
  ) w
  inner join WImage wi on wi.`work` = w.id

私のエンティティ定義:

Work
  ...

WImage
  work WorkId
  url Text

AdrNhood
  city AdrCityId
  name Text maxlen=100
  lat Double
  lng Double

-- This is a view with a computed column I used for ordering
AdrDistance
  nhood1 AdrNhoodId
  nhood2 AdrNhoodId
  distance Distance -- type Distance = Int - in Meters

そのような構造に似たようなselect を で定義するにはどうすればよいEsqueletoでしょうか (もちろん、単一のクエリを実行することによって)。

アップデート

私はこの道をたどろうとしました:

worksByNhood nId offset' limit' = 
  from $ \wi -> do
  (w, d) <- from $ \(w `InnerJoin` d) -> do
    on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood
    where_ (d ^. AdrDistanceNhood1 ==. val nId)
    orderBy [asc (d ^. AdrDistanceDistance)]
    offset offset'
    limit limit'
    return (w, d)
  where_ (wi ^. WImageWork ==. w ^. WorkId)
  return (w, d ^. AdrDistanceDistance, wi)

しかし、それは私を正しい解決策に駆り立てませんでした。誰かが私を助けることができる場合 (私がしようとしていることが実行可能ではないので、いくつかの選択を行うほうがよいと言ってもEsqueleto)、コメントするか、私の質問に答えてください。

4

1 に答える 1

0

私はgithubでこの問題 を読みましたが、私が試みていた方法でsEsqueletoをサポートするように設計されていないと結論付けたので、別の方法で行いました:selectfrom

worksByNhood nId offset' limit' = do
  works <- select $ from $ \(w `InnerJoin` d) -> do
    on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood
    where_ (d ^. AdrDistanceNhood1 ==. val nId)
    orderBy [asc (d ^. AdrDistanceDistance)]
    offset offset'
    limit limit'
    return (w, d ^. AdrDistanceDistance)
  works' <- forM works $ \(w@(Entity wId _), d) -> do
    images <- select $ from $ \wi -> do
      where_ (wi ^. WImageWork ==. val wId)
      return wi
    return (w, d, images);
  return works'

探していたものとは違いますが、とりあえず使ってみます。誰かがより良いアプローチを持っている場合は、教えてください。

于 2016-04-18T14:01:51.967 に答える