问题

我有一张这样的桌子:

 object Addresses extends Table[AddressRow]("address") {
   def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def street = column[String]("street")
  def number = column[String]("number")
  def zipcode = column[String]("zipcode")
  def city = column[String]("city")
  def country = column[String]("country")
  def geoLocationId = column[Int]("geo_location_id", O.Nullable)

 // Foreign keys.
 def geoLocation = foreignKey("fk_geo_location", geoLocationId, GeoLocations)(_.id)

 // Rest of my code.
 ...
}
 

我的案例课是:

 case class AddressRow(
  id: Option[Int] = None,
  street: String,
  number: String,
  zipcode: String,
  city: String,
  country: String,
  geoLocationId: Option[Int])
 

如您所见,geoLocation是可选的外键。

我找不到在外键定义中描述此“可选”的任何方法。

我试过像:

   def geoLocation = foreignKey("fk_geo_location", geoLocationId.asColumnOf[Option[Int]], GeoLocations)(_.id)
 

但我收到:

原因:scala.slick.SlickException:无法使用列Apply Function在外键约束中强制转换(仅允许命名列)

有人有建议吗?

  最佳答案

我认为您要使用外键无法实现。从Slick文档中检查联接用户定义的类型

注意 leftJoin 的示例:

 val explicitLeftOuterJoin = for {
  (c, s) <- Coffees leftJoin Suppliers on (_.supID === _.id)
} yield (c.name, s.name.?)
 

因此,如果您要查询所有 Addresses ,则需要以类似

 val addressGeolocQuery = for {
  (addr, loc) <- Addresses leftJoin GeoLocations on (_.geoLocationId === _.id)
} yield addr.id ~ loc.prop1.? ~ loc.prop2.? /*and so on*/
 

然后,您可以映射该查询的结果,以便返回具有 Option[GeoLocation] 的实际 Address 实例。这就是为什么我在文档中链接“用户定义的类型”的原因……这对我来说是一个新功能(我熟悉ScalaQuery,这是Slick的前身),但是看起来很有希望。

  相同标签的其他问题

scalaslick