【问题标题】:Dynamically created slick queries动态创建的灵活查询
【发布时间】:2015-01-08 10:58:48
【问题描述】:

我有三个表:users、groups 和 users_groups。组和用户之间存在多对多关系,因为一个用户可以属于多个组,一个组由多个用户组成。

我有一个 GET 查询,例如 /group?name=X&user=Y

我正在搜索名称为 X 的组,但棘手的部分是搜索 Y 用户不属于的组。

def findUserGroups(id: Long) = {
   users_groups.filter(ug => ug.userID === id)
} 

从中我得到用户所属的所有组,然后我这样做

var queries : List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]= List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]()
userGroups map { userGroup =>    
    val query : Query[GroupsTable, GroupsTable#TableElementType, Seq] = groups.filter(_.id =!= userGroup.group.get)
    queries = query :: queries
}

如果我 println userGroup 它会给我正确的组。

最后我一直在尝试联合

def findGroupByNameSynthFunction(name: String, queries: List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]) = {
    val query1 = groups.filter(g => g.name like ("%" + name + "%"))
    val unionQuery: Query[GroupsTable, GroupsTable#TableElementType, Seq] = query1
    queries map { query =>
       unionQuery ++ query
    }
    unionQuery
} 

我执行它

val found = GroupsTable.findGroupByNameSynthFunction(name, queries).run

但我还是得到了所有组。

谁能解释一下我做错了什么!? :)

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    我不确定你到底在哪里有错误的期望,但它可能围绕着表达

    queries map { query =>
       unionQuery ++ query
    }
    

    这没有任何副作用。除非您正在对结果值做某事(而您不是),否则这不会做任何事情。你可能想要类似的东西

    def findGroupByNameSynthFunction(
        name: String,
        queries: List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]
    ) = queries.map(_.filter(_.name like ("%" + name + "%")))
               .reduce(_ union _)
    

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2015-10-01
      相关资源
      最近更新 更多