0

假设我的数据库中有以下表:

CREATE TABLE dealers(
 id INT PRIMARY KEY, 
 name VARCHAR(255)
);    

CREATE TABLE makers(
 id INT PRIMARY KEY, 
 name VARCHAR(255)
);

CREATE TABLE cars(
 id INT PRIMARY KEY, 
 make INT FOREIGN KEY makers(id), 
 model VARCHAR(255), 
 year INT
);

CREATE TABLE cars_in_dealers(
 car_id INT FOREIGN KEY cars(id), 
 dealer_id INT FOREIGN KEY dealers(id), 
 UNIQUE KEY (car_id, dealer_id)
);

给定这样的模式,我想使用 Slick 在 Scala 中加载经销商:

case class Dealer(id: Int, name: String, models: Set[Car])
case class Car(id: Int, make: Maker, model: String, year: Int)
case class Maker(id: Int, name: String)

更复杂一点的东西怎么样:

如果我想跟踪每个经销商的型号数量怎么办:

case class Dealer(id: Int, name: String, models: Map[Car, Int])

这是我的映射表:

CREATE TABLE cars_in_dealers(
 car_id INT FOREIGN KEY cars(id), 
 dealer_id INT FOREIGN KEY dealers(id), 
 count INT,
 UNIQUE KEY (car_id, dealer_id)
);

我熟悉 Ruby 的 ActiveRecord 和 Java 的 Hibernate 框架,这些东西很容易做到,但我在 Slick 中很难做到,因为 Slick 不会将嵌套模型映射到外键表中。我正在使用 Slick 的代码生成器,它只生成以下类:

case class DealersRow(id: Int, name: String)
case class MakersRow(id: Int, name: String
case class CarsRow(id: Int, make: Int, model: String, year: Int)
case class CarsInDealersRow(carId: Int, dealerId: Int)
4

1 回答 1

3

使用查询来做到这一点!从文档中

Slick 新人经常问他们如何在 Slick 中做这样的事情:

case class Address( … )
case class Person( …, address: Address )

问题是这种硬编码要存在一个人需要一个地址。没有它就无法加载。这不符合 Slick 的理念,即让您对所加载的内容进行细粒度控制。使用 Slick,建议将一个表映射到一个元组或案例类,而它们没有对相关对象的对象引用。相反,您可以编写一个连接两个表并将它们作为元组或关联案例类实例返回的函数,在外部提供关联,而不是强绑定其中一个类。

val tupledJoin: Query[(People,Addresses),(Person,Address), Seq]
      = people join addresses on (_.addressId === _.id)

case class PersonWithAddress(person: Person, address: Address)
val caseClassJoinResults = tupledJoin.run map PersonWithAddress.tupled
于 2014-10-20T13:08:43.803 回答