今朝、Yesod アプリで Esqueleto のセットアップを開始しました。私は実際に LeftOuterJoin を実行しようとしていますが、基本を機能させるためにクエリをかなり単純化しました。私もそれを得ることができません。Database.Persist.Query との競合がないことを確認するために、Github の問題からのアドバイスに従って、 Yesod をインポートしない別のファイルにクエリを抽出しました。Esqueleto の設定で足りないものはありますか?
FWIW、私は Yesod 1.4.0、Persistent 2.1、および Esqueleto 2.1 を使用しています。
これは私が経験しているエラーです:
Queries.hs:9:15:
No instance for (Database.Esqueleto.Internal.Sql.SqlSelect
(SqlExpr (Entity UrlEntry), SqlExpr (Entity UrlEntryData))
(Entity UrlEntry))
arising from a use of ‘select’
In the expression: select
In the expression:
select
$ from
$ \ (entry `InnerJoin` entryData)
-> do { on
$ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId;
return (entry, entryData) }
In an equation for ‘findEntries’:
findEntries
= select
$ from
$ \ (entry `InnerJoin` entryData)
-> do { on
$ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId;
.... }
ここに私のモデルがあります:
UrlEntry
url String
shortCode String
ShortCode shortCode
visits Int default=0
userId UserId Eq
deriving Eq Show
UrlEntryData
screenshot String Maybe
title String Maybe
favicon String Maybe
contentType String
urlEntryId UrlEntryId Eq
deriving Eq Show
User
email Text
password Text Maybe
verkey Text Maybe
verified Bool
UniqueUser email
deriving Eq Show Typeable
そして、ここに私の質問があります:
findEntries :: SqlPersistT Handler [Entity UrlEntry]
findEntries = select $ from $ \(entry `InnerJoin` entryData) -> do
on $ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId
-- where_ (entry ?. UrlEntryUserId ==. valkey authId)
return (entry, entryData)