Noc*_*ebo 5 scala playframework playframework-2.0 slick slick-2.0
我陷入了一个光滑的查询,但不幸的是找不到类似的例子。
配置:
scalaVersion := "2.11.7"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "2.1.0"
Run Code Online (Sandbox Code Playgroud)
这是场景。我有一个称为的表/模型Record。对象本身拥有两个序列,即Tags和Markets。这是数据库结构的代表图像(我知道这不是ER图,也并非意味着):

Tags并Markets拥有自己的表格,并Record通过多对多关系进行连接 。目标是建立一个查询,以检索所有记录(无论标签和市场如何),具有市场的记录和具有标签的记录。我有这样的想法:
Future[Seq[(RecordModel, Option[Seq[MarketModel]], Option[Seq[TagModel]])]]
这就是我所拥有的:
def myFunction(): Future[Seq[(RecordModel, Seq[MarketModel], Seq[TagModel])]] = {
val query = for {
recs <- records joinLeft (recordsMarkets join markets on (_.marketId === _.marketId)) on (_.recordId === _._1.recordId) joinLeft (recordsTags join tags on (_.tagId === _.tagId)) on (_._1.recordId === _._1.recordId)
} yield recs
db.run(query.result).map(_.toList.groupBy(_._1).map {
case (r, m) => (
r._1, // Records
r._2.groupBy(_._2).toSeq.map { case (a, b) => a }, // Markets
t.flatMap(_._2.groupBy(_._2).map { case (t, relation) => t }) // Tags
)
}.toSeq)
}
Run Code Online (Sandbox Code Playgroud)
我不确定我是否在正确的道路上。看来这几乎是我想要的。此功能仅返回Records与Markets和Tags而不是让他们为可选。
我无法解决这个问题。似乎在任何地方都没有这种复杂查询的完整示例。任何帮助是极大的赞赏。提前致谢!
我终于有时间再次关注这个问题了。以我当前的架构和结构,我无法实现@Valerii Rusakov 的答案,但它极大地帮助解决了问题。谢谢你!
所以我是这样做的:
def myFunction: Future[Seq[(RecordModel, Seq[Option[(TagsModel, Record_TagsModel)]], Seq[Option[(MarketsModel, Record_MarketModel)]], Seq[Option[(UrlsModel, Record_UrlModel)]])]] = {
val query = for {
(((records, tags), markets), urls) <- (records filter (x => x.deleted === false && x.clientId === 1)
joinLeft (tags join recordTags on (_.tagId === _.tagId)) on (_.recordId === _._2.recordId)
joinLeft (markets join recordMarkets on (_.marketId === _.marketId)) on (_._1.recordId === _._2.recordId)
joinLeft (urls join recordUrls on (_.urlId === _.urlId)) on (_._1._1.recordId === _._2.recordId))
} yield (records, tags, markets, urls)
db.run(query.result).map(_.toList.groupBy(_._1).map { // Group by records
case (records, composedResult) =>
(
records,
composedResult.groupBy(_._2).keys.toSeq, // Tags and RecordTags
composedResult.groupBy(_._3).keys.toSeq, // Markets and RecordMarkets
composedResult.groupBy(_._4).keys.toSeq // Urls and RecordUrls
)
}.toSeq)
}
Run Code Online (Sandbox Code Playgroud)
请注意,我屈服于(((records, tags), markets), urls)。这使我可以稍后访问这些精确的属性,从而使分组和映射变得更加容易。它仍然不完美,因为我必须使用表和关系表,例如TagsModel, Record_TagsModel。但这只是一个小问题。也许你们中的一些人知道如何解决它。当前函数返回所有内容,records无论tags,markets或urls。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |