これらのテーブルがあります: USERS、USER_ROLES、ROLES、PERMISSIONS、ROLE_PERMISSIONS
私は以下を実装しています:
AssignedRoles (M): returns the set of roles assigned to a given user;
したがって、この関数のクエリを作成する場合は、次のようになります。
SELECT role_id FROM USER_ROLES WHERE user_id = 'M'
ここで、M は指定されたユーザー ID です。次に、ID で各ロールを検索して Role オブジェクトを返すか、結合を使用しますが、ここでは関係ありません。
私の UserRole モデルは次のようになります。
case class UserRole(id:Long, userID:Long, roleID:Long)
object UserRoles {
class UserRoles(tag: Tag) extends Table[UserRole](tag, "USER_ROLES") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def userID = column[Long]("USER_ID")
def roleID = column[Long]("ROLE_ID")
def user = foreignKey("USER_ID", userID, TableQuery[Users])(_.id)
def role = foreignKey("ROLE_ID", roleID, TableQuery[Roles])(_.id)
def * = (id, userID, roleID) <> (UserRole.tupled, UserRole.unapply)
}
def retrieveRoles(userID:Long) : List[Role] = {
DB.withSession { implicit session =>
userRoles.filter(_.userID === userID).list
}
}
予想どおり、retrieveRoles は UserRoles のリストを返しますが、ロールのリストが必要なので、UserRole.roleID を受け取る別のクエリを作成し、返された各 UserRole のロール テーブルでそれを見つける必要があります。これは多くのクエリであり、1 つのクエリでこれを行う方法があるように感じます。Slick の専門家からの助けはありますか?