2017-05-30 11 views
0

Ich habe eine einfache Abfrage in Slick (2.1), die zwei Tabellen in einer Eins-zu-viele-Beziehung verbindet. Definiert ungefähr wie folgt ...Slick.io - Handhabung von verknüpften Tabellen

class Users(tag: Tag) extends Table[ User ](tag, "users") 
    // each field here... 
    def * = (id, name).shaped <> (User.tupled, User.unapply) 

class Items(tag: Tag) extends Table[ Item ](tag, "items") 
    // each field here... 

    // foreign key to Users table 
    def userId = column[ Int ]("user_id") 
    def user_fk = foreignKey("users_fk", userId, Users)(_.id) 
    def * = (id, userId.?, description).shaped <> (Item.tupled, Item.unapply) 

Ein einzelner Benutzer kann mehrere Elemente haben. Die Benutzer Fall Klasse I sieht Marschall wollen wie ...

case class User(id: Option[Int] = None, name:String, items:Option[List[Item]] = None) 

ich dann die Datenbank mit einem impliziten Abfrage wie folgt verbinden ...

for{ 
    u <- Users 
    i <- Items 
     if i.userId === u.id 
    } yield(u, i) 

Dieses „läuft“ in Ordnung. Allerdings dupliziert die Abfrage offensichtlich die „Benutzer“ Datensatz für jeden „Item“, die dem Benutzer gehört zu geben ...

List(
(User(Some(1),"User1Name"),Item(Some(1),Some(1),"Item Description 1")), 
(User(Some(1),"User1Name"),Item(Some(2),Some(1),"Item Description 2"))) 

Gibt es eine elegante Möglichkeit, die „viele“ Teil in das Anwenderfall-Klasse zu ziehen? Ob es sich um Slick oder Scala handelt. Was ich würde im Idealfall mit ist am Ende mag ...

User(Some(1),"User1Name", 
    List(Item(Some(1),Some(1),"Item Description 1"), 
     Item(Some(2),Some(1),"Item Description 2"))) 

Dank!

Antwort

1

Eine Möglichkeit, es in Scala zu tun:

val results = List((User(Some(1), "User1Name"), Item(Some(1), Some(1), "Item Description 1")), 
        (User(Some(1), "User1Name"), Item(Some(2), Some(1), "Item Description 2"))) 

val grouped = results.groupBy(_._1) 
        .map { case (user, item: List[(User, Item)]) => 
         user.copy(items = Option(item.map(_._2))) } 

Diese Griffe mehrere verschiedene User s (grouped ist ein Iterable[User]).

Verwandte Themen