【问题标题】:How to define optional foreign key in Slick?如何在 Slick 中定义可选外键?
【发布时间】:2013-03-12 21:28:03
【问题描述】:

我有一张这样的桌子:

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:无法使用列应用 外键约束中的函数强制转换(仅命名列是 允许)

有人有建议吗?

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    尝试以下方法:

    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 如果它为空。

    【讨论】:

      【解决方案2】:

      我认为您尝试做的事情不能通过使用外键来完成。 查看 Slick 文档中的 joininguser defined types

      注意带有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 的前身),但它看起来很有前途。

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 2016-10-04
        • 2013-10-10
        • 2019-08-18
        • 1970-01-01
        相关资源
        最近更新 更多