如何在 slick 中创建带有外键的模型?
How to create model with foreign key in slick?
JVM 要求带有外键的模型的大小写 class 为:
case class Customer(id: Option[Int], name: String, surname: Option[String], gender: Option[String], addressId: Int)
在这种情况下,地址对象将只是 json 中的 id。
要使用内部地址对象生成 JSON,它应该是这样的:
case class Customer(id: Option[Int], name: String, surname: Option[String], gender: Option[String], address: Address)
并且在这种情况下代码无法编译。 class 客户应该如何看待才能使其正常工作?
class Customers(tag: Tag) extends Table[Customer](tag, "customer"){
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def surname = column[String]("surname")
def gender = column[String]("gender")
def addressId = column[Int]("address_id")
def * = (id.?, name, surname.?, gender.?, addressId) <> ((Customer.apply _).tupled, Customer.unapply)
def address = foreignKey("address",addressId,addresses)(_.id)
}
对于 Slick,您的 table class 应该代表您的 sql table,所以我会保留 Customers
class 和您一样写了它。
在我的 DAO
中,我会有一个方法:
def findCustomersWithAddress(): List[(Customer, Address)] = {
for {
customer <- customers
address <- adresses if customer.addressId = address.id
} yield (customer -> adress)
}.list
要生成JSON,可以写一个json.Writes[(Customer, Address)]
或者方法:
def toJson(customer: Customer, address: Address): JsObject = Json.obj(
...,
"address" -> Json.toJson(address)
)
JVM 要求带有外键的模型的大小写 class 为:
case class Customer(id: Option[Int], name: String, surname: Option[String], gender: Option[String], addressId: Int)
在这种情况下,地址对象将只是 json 中的 id。
要使用内部地址对象生成 JSON,它应该是这样的:
case class Customer(id: Option[Int], name: String, surname: Option[String], gender: Option[String], address: Address)
并且在这种情况下代码无法编译。 class 客户应该如何看待才能使其正常工作?
class Customers(tag: Tag) extends Table[Customer](tag, "customer"){
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def surname = column[String]("surname")
def gender = column[String]("gender")
def addressId = column[Int]("address_id")
def * = (id.?, name, surname.?, gender.?, addressId) <> ((Customer.apply _).tupled, Customer.unapply)
def address = foreignKey("address",addressId,addresses)(_.id)
}
对于 Slick,您的 table class 应该代表您的 sql table,所以我会保留 Customers
class 和您一样写了它。
在我的 DAO
中,我会有一个方法:
def findCustomersWithAddress(): List[(Customer, Address)] = {
for {
customer <- customers
address <- adresses if customer.addressId = address.id
} yield (customer -> adress)
}.list
要生成JSON,可以写一个json.Writes[(Customer, Address)]
或者方法:
def toJson(customer: Customer, address: Address): JsObject = Json.obj(
...,
"address" -> Json.toJson(address)
)