2016-08-03 37 views
1

Sagen wir, ich habe 3 Schemata: Tag, Post, User.Wie kann ich mit Ecto eine Abfrage erstellen, die Ergebnisse zurückgibt, die in zwei separaten Zuordnungen angezeigt werden?

Es gibt eine Viele-zu-viele-Beziehung zwischen Post und Tag mit einer Join-Tabelle und eine Viele-zu-Viele-Beziehung zwischen Post und Benutzer mit einer Join-Tabelle.

Ich möchte Beiträge auswählen, die zu einem bestimmten Tag und einem bestimmten Benutzer gehören.

user_posts_query = user |> assoc(:posts) 
tag_posts_query = tag |> assoc(:posts) 

Gibt es eine Möglichkeit, diese beiden Abfrageobjekte kombinieren können und wenn Repo.all mit() erhalten nur die überlappenden Ergebnisse von jedem?

Antwort

1

Ich habe die Gelegenheit nicht, es zu testen, aber ich denke, so etwas wie dies funktionieren soll:

Post 
|> join(:inner, [p], u in assoc(p, :users)) 
|> join(:inner, [p], t in assoc(p, :tags)) 
|> where([p, u, t], u.id == ^user.id and t.id == ^tag.id) 
|> Repo.all() 

Es ist nicht genau das sein, was Sie suchen, aber das funktioniert.

+0

Vielen Dank! Genau das, was ich brauchte. – rjoll