希望得到一些指导。
请考虑以下代码段:
val q = (for {
(d, o) <- dx innerJoin ox on (_.user === _.id)
} yield(d,o))
"div" #> q.map { case (x, y) =>
{
".dF1 *" #> x.name &
".dF2 *" #> y.id
}
}
在这个查询中,我有两个表,其中表“ox”是人员列表,“dx”是与这些人相关联的项目列表。 正如它所写,它运作良好,但我最终为一个人拥有的每个项目创建一行。假设有三个用户,前两个有两个项目,最后一个有1个,我有五行:
<div class="dF1">[user1]</div><div class="dF2">[item1]</div>
<div class="dF1">[user1]</div><div class="dF2">[item2]</div>
<div class="dF1">[user2]</div><div class="dF2">[item1]</div>
<div class="dF1">[user2[</div><div class="dF2">[item2]</div>
<div class="dF1">[user3]</div><div class="dF2">[item3]</div>
我想要做的是为每个用户创建一行,并在dF2字段内创建多个div,每个项目一个。然后布局是:
<div class="dF1">[user1]</div><div class="dF2">[item1] [item2]</div>
<div class="dF1">[user2]</div><div class="dF2">[item1] [item2]</div>
<div class="dF1">[user3]</div><div class="dF2">[item1]</div>
我该怎么做?我需要使用中间收藏吗?
答案 0 :(得分:4)
这里有两个选项,您可以使用数据库返回按字段分组的集合,也可以使用Scala对集合进行分组。如果您使用数据库,则仅限于按x.name
等字段进行分组,但您的执行可能会更高效。如果您使用Scala进行分组,则可以按整个对象x
进行分组,但最终会进行更多处理和对象创建。您需要确定哪种方法最适合您。
现在,说 - 让我们假设我们正在使用Scala。你会做这样的事情:
"div" #> q.groupBy(_._1).map { case (x, y) =>
{
".dF1 *" #> x.name &
".dF2 *" #> y.map{ case (x2, y2) => y2.id}.mkString(" ")
}
}
List
不是直接使用查询中包含D
和O
的{{1}},而是创建一个类型列表:groupBy
。在上面的示例中,我只是将Map[D, List[(D, O)]]
的{{1}}字段组合成一个字符串,以便输出看起来像您所请求的示例。
您可以让第二张地图返回id
而不是单个字符串,以进行进一步的转换。此示例将查找o
嵌套在具有类CssSel
的{{1}}中:
<div class="dF2SubDiv"></div>