Я работаю в проекте с фреймворком scala play 2, где я использую slick как FRM и базу данных postgres.Как присоединиться к двум таблицам и сопоставить результат с классом case в slick
В моем клиенте проекта есть сущность. Поэтому я также создаю класс и объект клиента, а также класс и объект клиента. Другим объектом является учетная запись. Поэтому я также создаю таблицу учетных записей и класс и объект класса. Код приведен ниже
case class Customer(id: Option[Int],
status: String,
balance: Double,
payable: Double,
created: Option[Instant],
updated: Option[Instant]) extends GenericEntity {
def this(status: String,
balance: Double,
payable: Double) = this(None, status, balance, payable, None, None)
}
class CustomerTable(tag: Tag) extends GenericTable[Customer](tag, "customer"){
override def id = column[Option[Int]]("id")
def status = column[String]("status")
def balance = column[Double]("balance")
def payable = column[Double]("payable")
def account = foreignKey("fk_customer_account", id, Accounts.table)(_.id, onUpdate = ForeignKeyAction.Restrict, onDelete = ForeignKeyAction.Cascade)
def * = (id, status, balance, payable, created, updated) <> ((Customer.apply _).tupled, Customer.unapply)
}
object Customers extends GenericService[Customer, CustomerTable] {
override val table = TableQuery[CustomerTable]
val accountTable = TableQuery[AccountTable]
override def copyEntityFields(entity: Customer, id: Option[Int],
created: Option[Instant], updated: Option[Instant]): Customer = {
entity.copy(id = id, created = created, updated = updated)
}
}
Теперь я хочу присоединиться к таблице клиентов и таблицу счета и карты результата в случае класса с именем CustomerWithAccount Я попытался следующий код
case class CustomerDetail(id: Option[Int],
status: String,
name: String)
object Customers extends GenericService[Customer, CustomerTable] {
override val table = TableQuery[CustomerTable]
val accountTable = TableQuery[AccountTable]
def getAllCustomersWithAccount = db.run(table.join(accountTable).on(_.id === _.id).map { row =>
//for (row1 <- row) {
for {
id <- row._1.id
status <- row._1.status.toString()
name <- row._2.name.toString()
} yield CustomerDetail(id = id, status = status, name = name)
//}
}.result)
override def copyEntityFields(entity: Customer, id: Option[Int], created:Option[Instant], updated: Option[Instant]): Customer = {
entity.copy(id = id, created = created, updated = updated)
}
}
Но это не Работа. Пожалуйста, помогите мне.
Не могли бы вы, возможно, разработать на то, что не работает? Не скомпилирован ли код или исключены ли исключения во время выполнения? – irundaia
проверить http://slick.lightbend.com/doc/3.0.0/orm-to-slick.html#orm-relationships (для slick 3.0.0) –