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!