我在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(grouped
是Iterable[User]
(。