2017-10-13 3 views
0

私はPhoenixアプリケーションの3つのテーブルで検索機能を実行していますが、SQLのUNION演算子のようなものを使用してそれらを結合したいと考えています。Ectoでユニオンを実行する

mix phx.gen.json Accounts User users handle:string email:string 
mix phx.gen.json Content Post posts title:string content:string 
mix phx.gen.json Content Category categories name:string 

はのは、外部キーまたはリンクテーブルが存在しないと仮定しましょう:

私は3つのテーブルを持っています。私は、SQLでこれらの間で、検索を実行したい場合は

、私はこのような何かをするだろう:

SELECT handle FROM users WHERE handle LIKE "%string%" 
UNION 
SELECT title FROM posts WHERE title LIKE "%string%" 
UNION 
SELECT name FROM categories WHERE name LIKE "%string%" 

しかし、エクト2は、労働組合をサポートしていないようです。私はこのような何かをしたい:

query1 = 
    from u in User, 
    where: ilike(u.handle, ^"%#{str}%"), 
    select: u 

query2 = 
    from p in Post, 
    where: ilike(p.title, ^"%#{str}%"), 
    select: p 

query3 = 
    from c in Category, 
    where: ilike(c.name, ^"%#{str}%"), 
    select: c 

union = Ecto.SomethingLikeAUnion([query1, query2, query3]) 
result = Repo.all(union) 

これを行うための最善の方法は何ですか?エクトは、労働組合のサポートを追加するまでは、最善の方法は、Repo.query/2で生のSQLを使用することです

+1

ないあなたが求めていたものが、...これは私がしばしばのようなものを使用する場合であります弾性検索。それは検索のはるかに良い仕事を行い、UNIONは問題ではないでしょう。あなたのアプリに余分な技術を追加することを躊躇しても、完全に理解できます。 – cleaver

答えて

関連する問題