scala - In one-to-many, how to express "where exists" in slick? -
let's assume 2 tables:
- cats,
cat
- personality traits,
personality_trait
were cat
has id
, personality_trait
has id
, string trait
.
e.g.
== cat == id | name --------------- 0 | tom 1 | garfield 2 | kitty == personality_trait === id | trait --------------- 0 | stubborn 1 | stubborn 1 | sleepy 1 | moody 2 | sleepy 2 | moody
how cats have @ least traits i'm interested in?
e.g. how garfield
when i'm looking stubborn
, moody
i thinking of like
personality_trait.groupby(_.id).filter { case (id, traits) => <predicate on traits> }.map(_._1)
i found solution, albeit inelegant , potentially inefficient:
val desiredtraits = set("stubborn", "moody") (for { catid <- personality_trait.filter(_.trait insetbind desiredtraits) .groupby(_.id).map { case (txnid, foundtraits) => (txnid, foundtraits.length) }.filter { case (txnid, foundtraitcount) => foundtraitcount >= desiredtraits.size }.map(_._1) cat <- cat if cat.id === catid } yield (cat)).result
Comments
Post a Comment