Гладкий много-много репо скала - PullRequest
0 голосов
/ 25 ноября 2018

это случайные клиентские и курсовые репо

@Singleton
class CourseRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {

  // We want the JdbcProfile for this provider
  val dbConfig = dbConfigProvider.get[JdbcProfile]

  import dbConfig._
  import profile.api._

  class CourseTable(_tableTag: Tag) extends Table[Course](_tableTag, "course") {
    def * = (courseId, name) <> ((Course.apply _).tupled, Course.unapply)

    def ? = (Rep.Some(courseId), Rep.Some(name)).shaped.<>({ r => import r._; _1.map(_ => (Course.apply _).tupled((_1.get, _2.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

    val courseId: Rep[Int] = column[Int]("course_id", O.PrimaryKey)
    val name: Rep[String] = column[String]("name", O.Length(255, varying = true))
  }

  private val courses = TableQuery[CourseTable]

  def create(course: Course) = db.run {
    courses += course
  }

  def findById(courseId: Int): Future[Course] = db.run {
    courses.filter(_.courseId === courseId).result.head
  }

  def createMany(courseList:Seq[Course]) = db.run{
    courses ++= courseList
  }

  def list(): Future[Seq[Course]] = db.run {
    courses.result
  }
}

@Singleton
class ClientRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  // We want the JdbcProfile for this provider
  private val dbConfig = dbConfigProvider.get[JdbcProfile]

  import dbConfig._
  import profile.api._

    private class ClientTable(tag: Tag) extends Table[Client](tag, "client") {
      def * = (userId, name) <> ((Client.apply _).tupled, Client.unapply)

      def ? = (Rep.Some(userId), Rep.Some(name)).shaped.<>({ r => import r._; _1.map(_ => (Client.apply _).tupled((_1.get, _2.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

      val userId: Rep[Int] = column[Int]("client_id", O.PrimaryKey, O.AutoInc)
      val name: Rep[String] = column[String]("name", O.Length(255, varying = true))
    }

  private val people = TableQuery[ClientTable]

  def create(client: Client) = db.run {
    people += client
  }

  def findById(clientId: Int) = db.run {
    people.filter(_.userId === clientId).result.head
  }

  def list(): Future[Seq[Client]] = db.run {
    people.result

}}

В чем моя проблема, у меня есть 3-я таблица client_course, где я сопоставляю отношения многие ко многим между этими двумя таблицамии для объединения мне нужен доступ к клиентской таблице и таблице курсов, но мой репозиторий client_course находится в другом классе, и я не могу просто получить доступ к таблице из clientrepo или courserepo, поэтому мой вопрос в том, как мне написать репозиторий client_course и получить доступ к таблицам.мне нужно выполнить несколько запросов на присоединение?

пример

    for {
      (client, course) <- clients join courses
    } yield (client, course)

, чтобы сделать это, я должен получить доступ к таблице клиентов и курсов, которая управляется другими репозиториями, если я просто поставлю TableQuery для клиента иКонечно, в моем репозитории client_course?

вот так

  private val clientCourses = TableQuery[ClientCourse]
  private val courses = TableQuery[Course]
  private val clients = TableQuery[Client]
...