8

我有一张这样的桌子:

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:不能在外键约束中使用列应用函数转换(只允许命名列)

有人有建议吗?

4

2 回答 2

19

尝试以下操作:

def geoLocationId = column[Option[Int]]("geo_location_id")
//Foreign Key
def geoLocation = foreignKey("fk_geo_location", geoLocationId, GeoLocations)(_.id.?)

geoLocationId现在是一个列,Option[Int]因此O.Nullable不再需要 (_.id.?)返回GeoLocation作为选项,或者None如果它为空。

于 2013-09-24T13:03:55.343 回答
3

我认为您尝试做的事情不能通过使用外键来完成。从 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*/

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

于 2013-03-12T21:57:22.530 回答