gpt4 book ai didi

scala - 光滑的 3.0 多对多查询,将连接作为可迭代对象

转载 作者:行者123 更新时间:2023-12-04 11:50:53 24 4
gpt4 key购买 nike

我已经使用 Slick 3.0 创建了一个多对多集合,但我正在努力以我想要的方式检索数据。

事件和兴趣之间存在多对多关系。这是我的表:

case class EventDao(title: String,
id: Option[Int] = None)


class EventsTable(tag: Tag)
extends Table[EventDao](tag, "events") {

def id = column[Int]("event_id", O.PrimaryKey, O.AutoInc)
def title = column[String]("title")

def * = (
title,
id.?) <> (EventDao.tupled, EventDao.unapply)

def interests = EventInterestQueries.query.filter(_.eventId === id)
.flatMap(_.interestFk)
}


object EventQueries {

lazy val query = TableQuery[EventsTable]

val findById = Compiled { k: Rep[Int] =>
query.filter(_.id === k)
}
}

这是 EventsInterests:
case class EventInterestDao(event: Int, interest: Int)


class EventsInterestsTable(tag: Tag)
extends Table[EventInterestDao](tag, "events_interests") {

def eventId = column[Int]("event_id")
def interestId = column[Int]("interest_id")

def * = (
eventId,
interestId) <> (EventInterestDao.tupled, EventInterestDao.unapply)

def eventFk = foreignKey("event_fk", eventId, EventQueries.query)(e => e.id)
def interestFk = foreignKey("interest_fk", interestId, InterestQueries.query)(i => i.id)
}


object EventInterestQueries {
lazy val query = TableQuery[EventsInterestsTable]
}

最后是兴趣:
case class InterestDao(name: String,
id: Option[Int] = None)

class InterestsTable(tag: Tag)
extends Table[InterestDao](tag, "interests") {

def id = column[Int]("interest_id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def name_idx = index("idx_name", name, unique = true)

def * = (
name,
id.?) <> (InterestDao.tupled, InterestDao.unapply)

def events = EventInterestQueries.query.filter(_.interestId === id)
.flatMap(_.eventFk)
}


object InterestQueries {

lazy val query = TableQuery[InterestsTable]

val findById = Compiled { k: Rep[Int] =>
query.filter(_.id === k)
}
}

我可以使用以下内容查询和检索 (event.name, interest) 的元组:
val eventInterestQuery = for {
event <- EventQueries.query
interest <- event.interests
} yield (event.title, interest.name)

Await.result(db.run(eventInterestQuery.result).map(println), Duration.Inf)

所以这就是我目前所拥有的。

我想要的是能够填充一个案例类,如:
case class EventDao(title: String,
interests: Seq[InterestDao],
id: Option[Int] = None)

问题是,如果我像这样更新我的案例类,它会弄乱我的 def *投影在 EventsTable .另外,我必须重命名 EventsTable.interests过滤到类似 EventsTable.interestIds 的内容这有点难看,但如果需要,我可以忍受。

另外,我找不到写 for 的方法。产生 (event.name, Seq(interest.name)) 的查询.无论如何,这只是我能够产生 (EventDao, Seq(InterestDao)) 的垫脚石。元组,这是我真正想要返回的。

有谁知道我如何实现这些目标?我还希望能够“获取”一定数量的兴趣,因此对于某些查询,所有查询都会返回,但对于其他查询,只有前 3 个会返回。

最佳答案

所以看完后this page并在邮件列表上聊天,我终于让它工作了:

val eventInterestQuery = for {
event <- EventQueries.query
interest <- event.interests
} yield (event, interest)

Await.result(db.run(eventInterestQuery.result
// convert the interests to a sequence.
.map {
_.groupBy(_._1)
.map {
case (k,v) => (k, v.map(_._2))
}.toSeq
}
), Duration.Inf)

关于scala - 光滑的 3.0 多对多查询,将连接作为可迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com