Scala/Slick:三向联接不起作用
我有两个表(姓名和电话),另一个表组有效地链接了这两个表(使用外键指向姓名和电话)。我正在尝试查询姓名和电话号码,而有些姓名不需要有电话号码Scala/Slick:三向联接不起作用,scala,slick,Scala,Slick,我有两个表(姓名和电话),另一个表组有效地链接了这两个表(使用外键指向姓名和电话)。我正在尝试查询姓名和电话号码,而有些姓名不需要有电话号码 val q = for { (n, (g, p)) <- names joinLeft groups on (_.id === _.nameId) join phones on (_.phoneId === _.id) // ABOVE LINE DOES NOT COMPILE !!! } yield (n, p) val q=for{
val q = for {
(n, (g, p)) <- names joinLeft groups on (_.id === _.nameId) join phones on (_.phoneId === _.id)
// ABOVE LINE DOES NOT COMPILE !!!
} yield (n, p)
val q=for{
(n,(g,p))而不是使用名称加入左组
。使用名称加入电话组
val q = for {
(n, pair) <- names joinLeft (groups join phones on (_.phoneId === _.id)) on (_.id === _._1.nameId)
} yield (n, pair)
val q=for{
(n,pair)而不是使用名称连接左组
。使用名称连接电话(uu.phoneId==id)
然后使用名称连接左组
val q = for {
(n, pair) <- names joinLeft (groups join phones on (_.phoneId === _.id)) on (_.id === _._1.nameId)
} yield (n, pair)
val q=for{
(n,pair)如果您想要一种干净的方法来实现这一点,您也可以尝试
val query = names joinLeft groups on {
case (n, g) => n.id === g.nameId
} join phones on {
case ((n, g), p) => n.phoneId === p.id
} map {
case ((n, g), p) => (n, p)
}
val result = db.run(query.result)
如果您有多个表要连接,这将是一种更好的/干净的方法。:)如果您想要一种干净的方法来连接,您也可以尝试
val query = names joinLeft groups on {
case (n, g) => n.id === g.nameId
} join phones on {
case ((n, g), p) => n.phoneId === p.id
} map {
case ((n, g), p) => (n, p)
}
val result = db.run(query.result)
如果您有多个表要加入,这将是一种更好的/干净的方式。:)由此我得到了一个错误:“value phoneId不是slick.lifted.Rep[Option[Contact.GroupTable]]”@srvy try now…添加了额外的括号您的更改是有意义的,但仍然得到了错误…[错误]../main.scala:361:value phoneId不是slick.lifted.Rep[Option[Example.GroupTable][error](n,(g,p))@srvy您可以尝试使用join
而不是joinLeft
。然后看看它是否正常away@srvy发生这种情况是因为joinLeft
与此一起,我得到以下错误:“value phoneId不是slick.lifted.Rep[Option[Contact.GroupTable]]”@srvy try now…添加了额外的括号您的更改很有意义,但仍然收到错误…[error]../main.scala:361:value phoneId不是slick.lifted.Rep[Option[Example.GroupTable]][error](n,(g,p))@srvy您可以尝试使用join
而不是joinLeft
。然后看看它是否成功away@srvy这是因为joinLeft