2016-04-26 6 views
2

Ich benutze Slick 3.1, Play Framework 2.5 und Scala 2.11. Meine Anwendung hat eine "Benutzer" -Tabelle mit der Referenzspalte "addressId", die sich auf die Spalte "id" der Tabelle "Address" bezieht. Ich kann keine Daten in diese beiden Tabellen einfügen. Hier ist der Code für diesenWie schreibe ich eine Abfrage einfügen für Tabelle, die Referenzspalte zu einer anderen Tabelle in Spiel-Slick mit Scala enthält?

Dies ist die Userform:

val registerForm: Form[RegisterForm] = Form { 
mapping(
    "id" -> optional(number), 
    "firstname" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\\s]+")), 
    "lastname" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\\s]+")), 
    "email" -> text.verifying(nonEmpty), 
    "password" -> text.verifying(nonEmpty), 
    "address" -> mapping(
     "id" -> optional(number), 
     "city" -> nonEmptyText.verifying("letters only", name => name.isEmpty || name.matches("[A-z\\s]+")), 
     "state" -> text, 
     "country" -> text, 
     "pin" -> number 
    )(AddressForm.apply)(AddressForm.unapply) 
)(RegisterForm.apply)(RegisterForm.unapply) 
} 

Dies sind zwei Modellklassen:

case class Address(id: Option[Int], city: String, state: String, country: String, pin: Int) 
case class User(id: Option[Int], firstname: String, lastname: String, email: String, password: String, addressId: Option[Int]) 

Hier beide Klassen zugeordnet entsprechende Datenbank-Tabellen mit Tabellen-Abfrage:

private class UserDB(tag: Tag) extends Table[User](tag, "user") { 

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc) 

def firstname = column[String]("firstname") 

def lastname = column[String]("lastname") 

def email = column[String]("email") 

def password = column[String]("password") 

def addressId = column[Option[Int]]("address_id") 

override def * = (id, firstname, lastname, email, password, addressId) <> ((User.apply _).tupled, User.unapply) 

def address_fk= foreignKey("fk_user_address", addressId, addressTable)(_.id) 

} 

private class AddressDB(tag: Tag) extends Table[Address](tag, "address") { 

def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc) 

def city = column[String]("city") 

def state = column[String]("state") 

def country = column[String]("country") 

def pin = column[Int]("pin") 

override def * = (id, city, state, country, pin) <> ((Address.apply _).tupled, Address.unapply) 

} 


private val userTable = TableQuery[UserDB] 

private val addressTable = TableQuery[AddressDB] 

Bitte, erzählen Sie, wie kann ich Daten in beide verwandten Tabellen mit einem einfügen Abfrage mit Slick.

Vielen Dank im Voraus.

Antwort

1

sollten Sie id Einsatz für Adresse Rückkehr verwenden und einen Einsatz in einzelnen Transaktion zu usertable, Beispiel:

val query = for { 
    adressId <- addressTable returning addressTable.map(_.id) += Address(....) 
    userTable += User(..., Some(adressId), ....) 
} yield() 

db.run(query.transactionally) 

bearbeiten: Abfrage über nichts zurückkehren, wenn Sie Benutzer, die Verwendung erstellt müssen:

val query = for { 
    adressId <- addressTable returning addressTable.map(_.id) += Address(....) 
    user <- userTable returning userTable += User(..., Some(adressId), ....) 
} yield user 

db.run(query.transactionally) 
+0

Vielen Dank @ HüseyinZengin, seine Arbeit und löste mein Problem. – Govardhan

+0

Diese Abfrage gibt die Einheit zurück. Was, wenn ich möchte, dass es Future [User] zurückgibt? – Govardhan

+0

Vielen Dank @ HüseyinZengin. – Govardhan

Verwandte Themen