1

私はSlick Plain SQLを使用しており、次のようなテーブルスキーマを持っています:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) NOT NULL
);

CREATE TABLE images (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  url VARCHAR(191) NOT NULL,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE
);

そして、次のようなケース クラス:

case class User(name: String, imageUrls: Array[String])

次のようなことができるように、クエリを暗黙的に記述することGetResultは可能ですか:

val u = Q.query[String, User]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").first(name)
4

1 に答える 1

5

ここで難しいのは、1 対多の関係です。画像の URL がユーザー ID によってGetResult単一のレコードに集約されるように、レコードを折りたたむことができるようにするためのすぐに使用できるものがあるかどうかはわかりません。Userただし、例にいくつかの調整を加えることで、この処理を自分で行うことができます。

case class User(name: String, imageUrls: List[String])

val records = Q.query[String, (String,String)]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").list(name)  

val users = records.groupBy(_._1).map(tup => User(tup._1, tup._2.map(_._2)))

完了するIterable[User]と、usersval としてが表示されます。

于 2013-07-25T01:11:29.930 に答える