2

今朝、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)
4

1 に答える 1

1

関数の署名を変更する必要があります。

findEntries :: SqlPersistT Handler [(Entity UrlEntry, Entity UrlEntryData)]
于 2014-11-01T14:43:13.843 に答える