【问题标题】:How do you use a sequence of foreignKeys in Slick?你如何在 Slick 中使用一系列外键?
【发布时间】:2019-08-07 07:29:11
【问题描述】:

docs 展示了如何将 foreignKey 映射为 ID。但是,它没有给出多个外键的示例。似乎人们制作了自己的映射表,例如 AuthorBooks,因此 Author 和 Book case 类不知道它们是相关的。

但是有一个foreignKeys 函数定义为:

final def foreignKeys: Iterable[ForeignKey] = tableConstraints.collect{ case q: ForeignKeyQuery[_, _] => q.fks }.flatten.toIndexedSeq.sortBy(_.name)

..但示例仅显示使用foreignKey.
你会怎么用呢?

case class Owner(name:String, dogIDs:Seq[Long])

考虑到 dogID 是某些 Dog 案例类的外键,它是否允许您映射这个案例类?

【问题讨论】:

  • 您打算在数据模型中使用序列?因为在你考虑使用这些外键之前,你需要做一个自定义类型,因为 Seq[Long] 不受 Slick 开箱即用的支持。

标签: scala playframework slick


【解决方案1】:

为了做到这一点,我们必须使用 DTO 和 DAO 方法......其中数据库模型具有一对多或多对多,当您转换它时,DTO 包含另一个对象的序列并由处理程序,例如:

DTO

case class City(code: String,
                lat: Double,
                lng: Double,
                countryCode: String,
                translations: Seq[CityI18n])

case class CityI18n(id: Option[Int], lang: String, name: String)

DAO 和 ROW:

case class CityRow(code: String, lat: Double, lng: Double, countryCode: String)
case class CityI18nRow(id: Int, cityCode: String, lang: String, name: String)

显然,您的映射表和 FK 的实现:

class CityI18nTable(tag: Tag) extends Table[CityI18nRow](tag, "cityi18n") {
//...
 def cityCode = column[String]("cityCode", O.Length(TextMaxLength_3))

 def cityCodeFK = foreignKey("city_i18n_city_fk", cityCode, Cities)(_.code, onUpdate = ForeignKeyAction.Cascade, onDelete = ForeignKeyAction.Cascade)
//...
}

所以我们在 repo 中构建它:

def find(code: String): Future[Option[City]] = {
    val query = for {
      city <- Cities if city.code === code
      cityI18n <- CityI18ns if city.code === cityI18n.cityCode
    } yield (city, cityI18n)

    def handler(mainTuples: Seq[(CityRow, CityI18nRow)]) = {
      mainTuples.groupBy(_._1).map {
        case (cityRow, tuples) =>
          val cityI18nRows = tuples.map(_._2).distinct
          City(cityRow.code, cityRow.lat, cityRow.lng, cityRow.countryCode, cityI18nRows)
      }.headOption
    }

   db.run(query.result).map(handler)
  }

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多