gpt4 book ai didi

scala - Slick - 使用外键约束并直接访问引用的对象作为列

转载 作者:行者123 更新时间:2023-12-04 11:53:46 26 4
gpt4 key购买 nike

我有两个模型(比如 Supplier Coffee ), Coffee 模型有对供应商模型的外键引用。在 ddl 期间,我希望这种关系存在于表创建中。但我也希望能够通过像 coffeeObj.supplier.name 这样的咖啡对象来引用供应商对象。 .下面是我的虚拟代码。我正在使用 MappedTable , foreignKeyTypeMapper .

import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession

object SlickTest {
// Supplier
case class Supplier(id: Option[Int], name: String)
object Suppliers extends Table[Supplier]("supplier") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id.? ~ name <> (Supplier, Supplier.unapply _)
def findOneById(id: Int): Supplier =
this.map { e => e }.where(r => r.id === id).firstOption.get
}

// Implicit Conversion from Supplier to Int
implicit val supTypeMapper = MappedTypeMapper.base[Supplier, Int](
{ s => s.id.get }, { id => Suppliers.findOneById(id) })

// Coffee
case class Coffee(name: Option[String], sup: Supplier, price: Double)
object Coffees extends Table[Coffee]("coffee") {
def name = column[String]("cof_name", O.PrimaryKey)
def sup = column[Supplier]("supplier")
def price = column[Double]("price")
def * = name.? ~ sup ~ price <> (Coffee, Coffee.unapply _)

def supplier = foreignKey("SUP_FK", sup, Suppliers)(_.id)
}
}

代码在 supplier 的定义的最后一行失败.任何人都可以发光吗?

最佳答案

在 Slick 中,您不会映射到引用其他案例类的案例类。要解析外键,您可以使用查询,您可以将其放入方法中以实现可重用性。

另见我的帖子:https://groups.google.com/d/msg/scalaquery/esFb2DjoHVE/NtMj7BmpE94J

编辑:
您不能遵循 coffeeObj 中的引用,这是一件好事。因为这需要像 ORM 一样配置加载策略,这会更复杂,并且会使代码的执行行为不那么明显。

延迟加载可能会加载 Controller 中的 coffeeObj 和 View 中的供应商,这看起来很奇怪,对吧?你可以这样做:

删除 .firstOption.get来自您的 findOneById方法,然后:

val supplierQuery = Query(Suppliers).findById(id)
val coffeeQuery = supplierQuery.join(Coffee).on(...).map(_._2)
// here is what you want, a supplier and the corresponding coffee:
val supplierWithCoffee = (supplierQuery.firstOption,coffeeQuery.f​irstOption)

将 join 放入函数以保存样板。

关于scala - Slick - 使用外键约束并直接访问引用的对象作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com