1

次の Yesod (Database.Persist) データベース スキーマがあるとします。

File
   path Text

Tag
   name Text

FileTag
   file FileId
   tag TagId
   UniqueFileTag file tag

特定のタグ レコードによって参照されるファイル レコードを Yesod で選択する最も便利な方法は何ですか? カスタム SQL に頼る必要がありますか? データベースのバックエンドとして PostgreSQL を使用しています。

4

2 に答える 2

3

カスタム SQL を使用してこの問題を解決できます。MongoDB のような非リレーショナル バックエンドをサポートする必要があるため、Persistent は ORM ではないため、別のソリューションを提供するとは思いません。

次のような基本的な結合を実装できます。

let tagFileStatement =
  Text.concat
  [ "SELECT ?? "
  , "FROM  file,     file_tag "
  , "WHERE file.id = file_tag.file "
  , "AND   ?       = file_tag.tag"
  ]
files <- runDB $ rawSql tagFileStatement
         [toPersistValue theTagIdThatYouWantToLookupFilesFor]
files :: [Entity File]
于 2012-08-13T13:31:28.513 に答える
0

アプリケーション レベルの結合または適切な SQL 結合として、1 対多の関係を処理するためのモジュールがあります。残念ながら、これらのモジュールはおそらく、Yesod プロジェクト全体で最も文書化されていない側面として数えられます。長期的には、より複雑な SQL クエリの状態を改善したいと考えていますが、現時点ではこれを示す実際のコードはありません。

Yesod メーリング リストにはこれらの使用方法を説明するスレッドがいくつかあります。 . Haddocks を改善するか、動作をより詳しく説明する wiki ページを作成する必要があります。

于 2012-08-13T17:27:05.057 に答える