2017-10-13 137 views
0

我在我的Phoenix應用程序的三個表上運行搜索功能,並且我想使用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 

假設沒有外鍵或鏈接表。

如果我想在運行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) 

這樣做的最佳方法是什麼?

+1

你問的不是什麼,但...這是我經常使用類似的情況下, Elasticsearch。它在搜索方面做得更好,聯盟也不會成爲問題。完全可以理解,但如果您猶豫是否將額外的技術添加到您的應用程序中。 – cleaver

回答

1

Ecto doesn't support unions at the moment.直到外生增加了對工會的支持,最好的辦法是使用原始的SQL與Repo.query/2

MyApp.Repo.query(""" 
    SELECT handle FROM users WHERE handle LIKE $1 
    UNION 
    SELECT title FROM posts WHERE title LIKE $1 
    UNION 
    SELECT name FROM categories WHERE name LIKE $1 
""", ["%#{str}%"])