Esqueletoの利用方法(Legacy版)
Type-safeにSQLを扱うためのEDSLでバックエンドはPersistentを利用しているライブラリです。
テーブルのJOIN
from関数 の中で、 InnerJoin や LeftOuterJoin や RightOuterJoin などが利用可能です。
getUsers ::
Param
-> Handler ([(Entity UsrMember, Value Text, Value Int)], Int)
= runDB $ do
getUsers p let pagePerLine = fromIntegral $ unPagePerLine p
= fromIntegral $ unPageNum p
page = fromIntegral $ unReqId p
reqId = [1, 2]
typeIds = (unAgeFrom p, unAgeTo p)
(ageFrom, ageTo) = from $ \(usrMember `InnerJoin`
baseQuery `InnerJoin`
usrImage -> do
usrAgeView) $ usrMember ^. UsrMemberUsrMemberId ==. usrAgeView ^. UsrAgeViewUid
on $ usrMember ^. UsrMemberUsrMemberId ==. usrImage ^. UsrImageUsrId
on $ do
where_ let reqQuery = usrMember ^. UsrMemberReqId ==. val reqId
= usrAgeView ^. UsrAgeViewAge >=. val ageFrom
ageQuery &&. usrAgeView ^. UsrAgeViewAge <=. val ageTo
^. UsrMemberTypeId `in_` valList typeIds
usrMember &&. (if reqId > 0 then reqQuery else val True)
&&. (if ageFrom > 0 && ageTo > 0 then ageQuery else val True)
&&. usrImage ^. UsrImageImageDiv ==. val 2
return
(
usrMember^. UsrImageFileName
, usrImage ^. UsrAgeViewAge
, usrAgeView
)=
baseQueryPage do
<- baseQuery
r * page)
offset (pagePerLine
limit pagePerLinereturn r
<- Import.length <$> select baseQuery
cnt <- select baseQueryPage
s return (s, cnt)
サブクエリ
サブクエリの注意点は、サブクエリの結果が取得できる場合、 subSelect関数 を利用すること、条件によってはサブクエリ結果が取得できない場合は、 subSelectMaybe関数 を利用することです。
getList ::
Key UsrMember
-> Handler Int
UsrMemberKey uid) = runDB $ do
getList (let pagePerLine = 10
= 0
page <- select $ from $ \(um `InnerJoin` mdt) -> do
list let newRec = subSelect $ from $ \mdt -> do
$ mdt ^. MsgDetailRefUsrMemberId ==. um ^. UsrMemberUsrMemberId
where_ 1
limit ^. MsgDetailCreateTime)]
orderBy [desc (mdt return $ mdt ^. MsgDetailCreateTime
$
on ^. UsrMemberUsrMemberId ==. mdt ^. MsgDetailRefUsrMemberId
um $ do
where_ ^. UsrMemberUsrMemberId ==. val uid
um &&.
^. UsrMemberStatusFlag >=. val contractStatusFlag
um ^. UsrMemberCreateTime)]
orderBy [ desc (um
limit pagePerLine
offset pagereturn (newRec, um ^. UsrMemberNickname)
return 0
補足説明
Value typ
select関数 で最後にreturnされる値は、 「um ^. UsrMemberNickname」で、
return (newRec, um ^. UsrMemberNickname)
モデルで定義されている、UsrMemberのnicknameのフィールドを意味しています、そしてnicknameフィールドが
UsrMember
...
nickname Text sqltype=varchar(64)
のように宣言されている場合、(Value typ) でtypがText型 (Value Text) で取得できるようになります。
Entity
Entityはテーブル情報そのものを表現しています
return
(
usrMember^. UsrImageFileName
, usrImage ^. UsrAgeViewAge
, usrAgeView )
usrMemberについては、テーブルすべての項目を取得している書き方で、モデルが
UsrMember
Int sqltype=bigint default=nextval('usr_member_usr_member_id_seq')
usrMemberId ...
Text sqltype=varchar(64) nickname
のような場合、usrMemberIdは Primary で Auto Increment とすると
data Entity record =
Entity
{ entityKey :: Key record
entityVal :: record
, }
で定義されるように、Primary Key と record (実際のレコードデータ) の2つで取得できます。
キーの値を取る場合はパターンマッチで取得するパターンと
func :: Key UsrMember -> Handler ()
UsrMemberKey pk = do
func ...
Keyを取ってInt64を返す関数として書くこともできます。
fromTblFreeKey :: Key TblFree -> Int64
= unSqlBackendKey . unTblFreeKey fromTblFreeKey
備忘録で書いておきます、気がつけば追加していきます。
githubサンプルコード はこちらに置いてあります。
Posted on 2021-01-15 18:06:05