2

希望得到一些指导。

考虑这个片段:

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>

我怎样才能做到这一点?我需要使用中介集合吗?

4

1 回答 1

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包含DO来自您的查询。在上面的示例中,我只是将您的字段组合成一个字符串以输出,看起来像您请求的示例。groupByMap[D, List[(D, O)]]ido

除了单个字符串,您还可以让第二个地图返回 aCssSel以进行进一步的转换。此示例将查找<div class="dF2SubDiv"></div>嵌套在div具有类的 中dF2

"div" #>  q.groupBy(_._1).map { case (x, y) =>
  {
       ".dF1 *" #> x.name &
       ".dF2" #> y.map{ case (x2, y2) => 
           ".dF2SubDiv *" #>  y2.id
        }
  }
}

如果您更愿意使用 Slick 进行 groupBy,您可以在此处此处找到更多信息。

于 2013-10-04T12:55:50.977 回答