【问题标题】:Scala Slick Play framework: How to join multiple DB tables using slick 3.x?Scala Slick Play 框架:如何使用 slick 3.x 连接多个数据库表?
【发布时间】:2020-08-02 21:02:46
【问题描述】:

我正在开发 scala play 框架应用程序,我需要从 4 个表中获取数据。我不知道如何使用光滑的 ORM 编写连接查询。我想将以下查询转换为 slick 查询:

select r.id, r.resource_name, r.uri from resource r 
inner join resource_role r_role on r.id=r_role.resource_id
inner join role ro on ro.id=r_role.role_id 
inner join user_role users_r on ro.id=users_r.role_id
inner join users u on u.user_id=users_r.user_id where u.user_id='1sdf23sfd45dsf6....';

或者如果我可以使用 slick 编写本机 sql 查询。

我的映射实体如下:

class ResourceTable(tag: Tag) extends Table[Resource](tag, "RESOURCE") {
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
    def resourceName = column[String]("RESOURCE_NAME")
    def uri = column[String]("URI")

    def * = (id, resourceName, uri) <>
      (Resource.tupled, Resource.unapply _)
  }

  val resourceData = TableQuery[ResourceTable]

  class RoleTable(tag: Tag) extends Table[Role](tag, "ROLE") {
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
    def roleName = column[String]("ROLE_NAME")

    def * = (id, roleName) <>
      (Role.tupled, Role.unapply _)
  }

  val roleData = TableQuery[RoleTable]

  class UserRoleTable(tag: Tag) extends Table[UserRole](tag, "USER_ROLE") {
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
    def userId = column[String]("USER_ID")
    def userName = column[String]("USER_NAME")
    def roleId = column[Int]("ROLE_ID")

    def * = (id, userId, userName, roleId) <>
      (UserRole.tupled, UserRole.unapply _)

    def userFk = foreignKey("USER_FK", userId, usersData)(user => user.userID)

    def roleFk = foreignKey("ROLE_FK_1", roleId, roleData)(role => role.id)
  }

  val userRoleData = TableQuery[UserRoleTable]

  class ResourceRoleTable(tag: Tag) extends Table[ResourceRole](tag, "RESOURCE_ROLE") {
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
    def resourceId = column[Int]("RESOURCE_ID")
    def roleId = column[Int]("ROLE_ID")

    def * = (id, resourceId, roleId) <>
      (ResourceRole.tupled, ResourceRole.unapply _)

    def resourceFk = foreignKey("RESOURCE_FK", resourceId, resourceData)(resource => resource.id)

    def roleFk = foreignKey("ROLE_FK_2", roleId, roleData)(role => role.id)
  }

  val resourceRoleData = TableQuery[ResourceRoleTable]

提前致谢!

【问题讨论】:

标签: sql scala playframework slick


【解决方案1】:

来自docs 会是这样的:

val joined = for {
  r <- resourceData
  r_role <- resourceRoleData if r.id === r_role.resourceId
  ro <- roleData if r_role.roleId === ro.id
  ...
} yield (r, r_role, ro, users_r, u)
joined.filter {
  case (r, r_role, ro, users_r, u) =>
    u.userId === '1sdf23sfd45dsf6....'
}.map {
  case (r, r_role, ro, users_r, u) =>
    (r.id, r.resourceName, r.uri)
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-06-14
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2016-01-09
  • 2016-10-14
  • 2016-08-18
相关资源
最近更新 更多