2

I want to add two clauses in where method of Slick query. I have fllowing code:

val users = TableQuery[Users]
val actions = TableQuery[Acts]
val filteredUsers = users.where(.....) // Some condition
val acts = actions.where(_.domain === 10)
val ownerAct = acts.where(_.owner in filteredUsers)
val assigneeAct = acts.where(_.assignee in filteredUsers)

I want to fetch actions which belong to either of assignee or ownerer in filtered users. I want code to be something like this:

val users = TableQuery[Users]
val actions = TableQuery[Acts]
val filteredUsers = users.where(.....) // Some condition
val acts = actions.where(_.domain === 10)

val ownerOrAssigneeAct = acts.where(_.owner in filteredUsers).
                                 or(_.assignee in filteredUsers)

How can I generate such an OR query in .where() using Scala Slick 2.0?

tuxdna
  • 8,257
  • 4
  • 43
  • 61

1 Answers1

9

There are a couple of things, first to use in your query must return something, instead of

val filteredUsers = users.where(.....)

Should be (taken from this answer):

val filteredUsers = users.filter(/* condition */).map(_.id)

Assumed that you want to match on ids, then you can compose conditions simply using an anonymous function:

val ownerOrAssigneeAct = 
  acts.filter(act => act.domain === 10 && (act.owner in filteredUsers || act.assignee in filteredUsers))

Note that I'm not using where since it's deprecated, use filter instead.

Community
  • 1
  • 1
Ende Neu
  • 15,581
  • 5
  • 57
  • 68
  • 2
    acts.filter(act => act.domain === 10).filter(act.owner in filteredUsers || act.assignee in filteredUsers)) would be equally fine. – cvogt Jul 04 '14 at 10:33