sql - Scala Slick Play 框架:如何使用 slick 3.x 连接多个数据库表?
问题描述
我正在开发 scala play 框架应用程序,我需要从 4 个表中获取数据。我不知道如何使用光滑的 ORM 编写连接查询。我想将以下查询转换为光滑查询:
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]
提前致谢!
解决方案
从文档中它会是这样的:
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)
}
推荐阅读
- android - 出现错误:覆盖方法应该调用 super.onActivityResult
- uitableview - 表单中的 SwiftUI Pickers 出错:UITableView 被告知在不位于视图层次结构中的情况下布局其可见单元格和其他内容
- firebase - 在本地窗口上调试 firebase
- algorithm - 如何多次更新树的节点?
- javascript - 找不到模块:无法解析“./node_modules/@material-ui/core/IconButton”
- python - 为什么我的 Django robots.txt 在开发中有效,但在生产中返回服务器错误 500?
- javascript - 为什么我的 addEventListener 不能使用我的 laravel 刀片文件
- ios - 语言默认为英语而不是法语为法语法语
- c# - 保存许多属于文件的标签的推荐数据格式/结构?
- php - PHP 调用 Graphdb 在 shell 中工作,而不是在浏览器中