我正在尝试过滤三个对象列表并将它们循环输出,我使用PlayFramework,我在后端运行Java,我只在前端使用Scala模板。
我们假设以下内容:
我现在有3个列表:AList
,BList
,CList
列表A和C没有任何共同之处,但列表B是中间的链接列表,它充当连接。列表C包含具有两个属性的对象:idA
和idC
。现在我想接收来自AList
的所有对象,如果BList
中存在ID,我想显示来自CList
的其他信息。我真的不知道如何在scala中处理这个问题。我读了一些关于压缩列表的线程,并提出了这样的方法:
@listCheckA = @{
AList.map(a => (a, BList.map(_.idA).contains(a.idA)))
}
@listCheckC = @{
CList.map(c => (c, BList.map(_.idC).contains(c.idC)))
}
@listLinked = @{
listCheckA.zip(listCheckC).map( ??? )
}
之后我想输出带有for
循环的对象。
如果这可能是一种合法的方法,我应该在listLinked做什么来检查我的条件?
很抱歉,如果这个问题听起来很愚蠢,我以前几乎不会使用Scala。
提前致谢!
答案 0 :(得分:1)
首先,这看起来很像一个多对五的链接表,你应该可以使用你的数据库库来处理,比如
SELECT a.*, c.* FROM TableA as a, TableB as b, TableC as c WHERE a.idA = b.idA AND c.idC = b.idC`
如果你真的需要使用scala(正如我在你之前的帖子中所说的,逻辑不应该在模板中,而是在你的控制器中),你可以将其作为理解来实现:
@for {
a <- AList
b <- BList if b.aid == a.aid
c <- CList if c.cid == b.cid
} {
// ... do whatever you want with a and b and c here ...
}
这与另外三个for
循环相同,除了if
语句将执行它所说的内容(过滤满足谓词的元素)。
除非您使用上述SQL语句直接在数据库中查询,否则您会发现很难更有效地执行此操作。