Scala Slick-使用foreignKey约束并直接作为列访问引用对象

Scala Slick-使用foreignKey约束并直接作为列访问引用对象,scala,foreign-key-relationship,slick,type-conversion,Scala,Foreign Key Relationship,Slick,Type Conversion,我有两个模型(比如,供应商和咖啡),咖啡模型对供应商模型有外键引用。在ddl期间,我希望此关系存在于表创建中。但我也希望能够通过coffeeObj.Supplier.name等coffeeObj.Supplier对象引用供应商对象。下面是我的伪代码。我正在使用,并且 导入scala.slick.driver.H2Driver.simple_ 导入Database.threadLocalSession 物体光滑试验{ //供应商 案例类供应商(id:Option[Int],名称:String) 对

我有两个模型(比如,供应商咖啡),咖啡模型对供应商模型有外键引用。在ddl期间,我希望此关系存在于表创建中。但我也希望能够通过coffeeObj.Supplier.name等coffeeObj.Supplier对象引用供应商对象。下面是我的伪代码。我正在使用,并且

导入scala.slick.driver.H2Driver.simple_
导入Database.threadLocalSession
物体光滑试验{
//供应商
案例类供应商(id:Option[Int],名称:String)
对象供应商扩展表[供应商](“供应商”){
def id=列[Int](“id”,O.PrimaryKey,O.AutoInc)
def名称=列[字符串](“名称”)
def*=id.?~名称(供应商,供应商.未申请u41;
def findOneById(id:Int):供应商=
this.map{e=>e}.where(r=>r.id==id).firstOption.get
}
//从供应商到Int的隐式转换
隐式val supTypeMapper=MappedTypeMapper.base[供应商,内部](
{s=>s.id.get},{id=>Suppliers.findOneById(id)})
//咖啡
案例级咖啡(名称:选项[字符串],供应商:供应商,价格:双倍)
对象咖啡扩展表[咖啡](“咖啡”){
def name=列[String](“cof_name”,O.PrimaryKey)
def sup=列[供应商](“供应商”)
def价格=列[双精度](“价格”)
def*=名称?~sup~价格(咖啡,咖啡。不适用)
def供应商=外键(“SUP_FK”,SUP,Suppliers)(uu.id)
}
}

供应商定义的最后一行代码失败。有人能解释一下吗?

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

另请参见我的帖子:

编辑:
在coffeeObj中你不能跟随推荐人,这是一件好事。因为这需要像在ORMs中那样配置加载策略,这将更加复杂,并且会使代码的执行行为不那么明显

延迟加载可能会在控制器中加载coffeeObj,在视图中加载supplier,这看起来很奇怪,对吗?您可以这样做:

删除
.firstOption。从您的
findOneById
方法中获取
,然后:

val supplierQuery=Query(供应商)。findById(id)
val coffeeQuery=supplierQuery.join(Coffee).on(…).map(\u2)
//以下是您想要的、供应商和相应的咖啡:
val supplierWithCoffee=(supplierQuery.firstOption,coffeeQuery.f​回采)

将连接放入一个函数中以保存锅炉板。

因此,无法访问
coffeeObj.supplier.name
?您不能在coffeeObj中使用引用,这是一件好事。我用更多信息扩展了答案。使用
TableQuery[Suppliers]
而不是
Query(Suppliers)
在Slick 0.8in Slick>=2.0或play Slick>=0.8(或0.7?),即:)