1

これらのテーブルがあります: 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 の専門家からの助けはありますか?

4

1 に答える 1

1
userRoles.filter(_.userID === userID).flatMap(_.role)
于 2014-03-29T21:21:12.627 に答える