[英]Yesod Esqueleto - How can I express selects with inner pagination?
I am doing a paginated resource, which will require an inner select, which I've already designed in sql terms. 我正在做一个分页的资源,这将需要一个内部选择,这是我已经用sql术语设计的。 It has the following structure: 它具有以下结构:
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
My entity definitions: 我的实体定义:
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
How can I define such a select in Esqueleto
, which would resemble such structure (by doing one single query of course)? 如何在Esqueleto
定义这样的选择,该选择类似于这样的结构(当然, Esqueleto
执行一个查询)?
Update 更新资料
I tried to follow this path: 我试图遵循这条路:
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)
But it didn't drive me to the correct solution. 但这并没有驱使我找到正确的解决方案。 If someone can help me (even saying that I would be better doing several selects because what I am trying is not viable in Esqueleto
), please, comment or answer my question. 如果有人可以帮助我(甚至说我会做一些选择会更好,因为我尝试的操作在Esqueleto
中Esqueleto
),请发表评论或回答我的问题。
I have read this issue on github and I concluded Esqueleto
wasn't designed to support select
s in from
s the way I was trying, so I did differently: 我已经在github上阅读了此问题,并得出结论Esqueleto
并非旨在以我尝试的方式支持select
from
,因此我做了不同的事情:
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'
It is not exactly what I was looking for, but for now I will use it. 这并不是我一直在寻找的东西,但是现在我将使用它。 If somebody have a better approach, please, tell me. 如果有人有更好的方法,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.