2016-09-04 1 views
1

Я работаю в проекте с фреймворком 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) 
    } 
} 

Но это не Работа. Пожалуйста, помогите мне.

+1

Не могли бы вы, возможно, разработать на то, что не работает? Не скомпилирован ли код или исключены ли исключения во время выполнения? – irundaia

+0

проверить http://slick.lightbend.com/doc/3.0.0/orm-to-slick.html#orm-relationships (для slick 3.0.0) –

ответ

3

Вы можете попробовать этот запрос

db.run((table.join(accountTable).on(_.id === _.id) 
    .map{ 
    case (t,a) => ((t.id, t.status, a.name) <> (CustomerDetail.tupled, CustomerDetail.unapply _)) 
    }).result) 

 Смежные вопросы

  • Нет связанных вопросов^_^