Slick.io-处理连接的桌子



我在Slick(2.1(中有一个简单的查询,该查询与两张表连接在一起,以一对一的关系。大致定义如下...

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)

单个用户可以有多个项目。我想元帅的用户案例类看起来像...

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

i然后查询具有隐式加入的数据库...

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

这个"运行"很好。但是,查询显然复制了属于用户提供的每个"项目"的"用户"记录...

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")))

是否有一种优雅的方式将"许多"部分拉入用户案例类中?无论是光滑的还是Scala。我理想地最终想到的是...

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

谢谢!

在Scala中进行操作的一种方法:

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))) }

此处理多个不同的User S(groupedIterable[User](。

最新更新