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 の codegen を使用しています。

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 )

問題は、これが Person を存在させるには Address が必要であることをハードコードしていることです。これがないと読み込めません。これは、正確にロードするものをきめ細かく制御できるようにするという Slick の哲学には適合しません。Slick では、関連するオブジェクトへのオブジェクト参照を持たずに、1 つのテーブルをタプルまたはケース クラスにマップすることをお勧めします。代わりに、2 つのテーブルを結合し、それらをタプルまたは関連ケース クラス インスタンスとして返す関数を記述して、クラスの 1 つを強く関連付けるのではなく、外部的に関連を提供することができます。

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 に答える