Scala Slick 在其结构之外扩展了 table 的功能
Scala Slick extend the functionality of a table outside of its structure
我正在使用 Slick code-gen 输出一个非常正常的 Tables.scala 文件,它映射了我的数据库结构的 tables/columns。
但是我想扩展我的 DAO 中那些表的功能,事实证明这对我来说是不可能的(对 scala 和 play 框架来说是新手)
INSIDE Tables.scala 在 class 会议中
您可以编写可以访问 I.E
列的函数
class Meeting(_tableTag: Tag) extends profile.api.Table[MeetingRow](_tableTag, "meeting") {
def * = (id, dateandtime, endtime, organisationid, details, adminid, datecreated, title, agenda, meetingroom) <> (MeetingRow.tupled, MeetingRow.unapply)
def ? = (Rep.Some(id), Rep.Some(dateandtime), Rep.Some(endtime), Rep.Some(organisationid), Rep.Some(details), Rep.Some(adminid), Rep.Some(datecreated), Rep.Some(title), Rep.Some(agenda), Rep.Some(meetingroom)).shaped.<>({r=>import r._; _1.map(_=> MeetingRow.tupled((_1.get, _2.get, _3.get, _4.get, _5.get, _6.get, _7.get, _8.get, _9.get, _10.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
val id: Rep[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey)
val dateandtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("dateandtime")
val endtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("endtime")
val organisationid: Rep[Int] = column[Int]("organisationid")
val details: Rep[String] = column[String]("details", O.Default(""))
val adminid: Rep[Int] = column[Int]("adminid")
val datecreated: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("datecreated")
val title: Rep[String] = column[String]("title", O.Default(""))
val agenda: Rep[String] = column[String]("agenda", O.Default(""))
val meetingroom: Rep[Int] = column[Int]("meetingroom")
def getAttendees = Tables.Meeting2uzer.filter(_.meetingid === id)
上面函数中的 "ID" 是 Meeting 中的一个列。
现在,当我想在我的 DAO 中编写无法访问范围内的列的相同函数时,问题就出现了。"getAttendees"
类似于....
@Singleton
class SlickMeetingDAO @Inject()(db: Database)(implicit ec: ExecutionContext) extends MeetingDAO with Tables {
override val profile: JdbcProfile = _root_.slick.jdbc.PostgresProfile
import profile.api._
private val queryById = Compiled((id: Rep[Int]) => Meeting.filter(_.id === id))
def getAttendees = Meeting2uzer.filter(_.meetingid === "NEED ID OF COLUMN IN SCOPE")
我如何获得 'id',它是我的 DAO 范围内 Tables.Meeting 中的一列,以完成此 getAttendees 函数。
如果我没理解错的话,你是想连接两个表?
Meeting2uzer.join(Meeting).on(_.meetingid === _.id)
您在 Tables.scala 中所做的将更符合在 Slick 中创建外键。您可以创建一个灵活的外键,而不是使用显式连接。请参阅 Slick here.
的文档
我正在使用 Slick code-gen 输出一个非常正常的 Tables.scala 文件,它映射了我的数据库结构的 tables/columns。
但是我想扩展我的 DAO 中那些表的功能,事实证明这对我来说是不可能的(对 scala 和 play 框架来说是新手)
INSIDE Tables.scala 在 class 会议中 您可以编写可以访问 I.E
列的函数 class Meeting(_tableTag: Tag) extends profile.api.Table[MeetingRow](_tableTag, "meeting") {
def * = (id, dateandtime, endtime, organisationid, details, adminid, datecreated, title, agenda, meetingroom) <> (MeetingRow.tupled, MeetingRow.unapply)
def ? = (Rep.Some(id), Rep.Some(dateandtime), Rep.Some(endtime), Rep.Some(organisationid), Rep.Some(details), Rep.Some(adminid), Rep.Some(datecreated), Rep.Some(title), Rep.Some(agenda), Rep.Some(meetingroom)).shaped.<>({r=>import r._; _1.map(_=> MeetingRow.tupled((_1.get, _2.get, _3.get, _4.get, _5.get, _6.get, _7.get, _8.get, _9.get, _10.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
val id: Rep[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey)
val dateandtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("dateandtime")
val endtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("endtime")
val organisationid: Rep[Int] = column[Int]("organisationid")
val details: Rep[String] = column[String]("details", O.Default(""))
val adminid: Rep[Int] = column[Int]("adminid")
val datecreated: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("datecreated")
val title: Rep[String] = column[String]("title", O.Default(""))
val agenda: Rep[String] = column[String]("agenda", O.Default(""))
val meetingroom: Rep[Int] = column[Int]("meetingroom")
def getAttendees = Tables.Meeting2uzer.filter(_.meetingid === id)
上面函数中的 "ID" 是 Meeting 中的一个列。
现在,当我想在我的 DAO 中编写无法访问范围内的列的相同函数时,问题就出现了。"getAttendees"
类似于....
@Singleton
class SlickMeetingDAO @Inject()(db: Database)(implicit ec: ExecutionContext) extends MeetingDAO with Tables {
override val profile: JdbcProfile = _root_.slick.jdbc.PostgresProfile
import profile.api._
private val queryById = Compiled((id: Rep[Int]) => Meeting.filter(_.id === id))
def getAttendees = Meeting2uzer.filter(_.meetingid === "NEED ID OF COLUMN IN SCOPE")
我如何获得 'id',它是我的 DAO 范围内 Tables.Meeting 中的一列,以完成此 getAttendees 函数。
如果我没理解错的话,你是想连接两个表?
Meeting2uzer.join(Meeting).on(_.meetingid === _.id)
您在 Tables.scala 中所做的将更符合在 Slick 中创建外键。您可以创建一个灵活的外键,而不是使用显式连接。请参阅 Slick here.
的文档