簡體   English   中英

Elixir Ecto:多個連接和可重用/可組合查詢

[英]Elixir Ecto : multiple joins and reusable/composable queries

在Ecto中,您可以像這樣制作可重用/可組合的查詢:

defmodule AModel
  #...

  def anonymous(q), do: q |> where([am], is_null(am.user_id))
end

請參閱此博客文章中的更多示例。

但是,我遇到使用多個連接的問題。

假設我們有一個如下所示的模式:

  • AModel屬於BModel
  • BModel屬於CModel
  • CModel屬於DModel

本文中提出的解決方案並不適用於深連接:

q = DModel
|> join(:inner, [dm], cm in assoc(dm, :c_models))
|> join(:inner, [_, cm], bm in assoc(cm, :b_models))
|> join(:inner, [_, _, bm], am in assoc(bm, :a_models)) 
|> AModel.anonymous

查詢函數將綁定表作為第一個(連接的第二個)參數。 它包含以前的連接,並且很難加入訂單。

在我們的例子中, anonymous函數以起始表為目標。 但是在查詢示例中,AModel是第4個綁定...

任何想法或技術擺脫這種順序依賴?

編輯:

我從博客作者那里得到了答案。 他告訴我,沒有本地的其他方式來處理綁定而不是表中的位置。 他還在這篇文章中強調了這一事實。

但是為了上帝的緣故,如果順序只是重要的,為什么我不能在它上面創建一個將名稱與綁定索引相關聯的命名映射?

這問題太多了:p?

使用命名綁定

Ecto 3.0為此用例添加了命名綁定

也許創建一些聯結表


編輯:我可以看到,也許我有點太簡潔了。 我的意思是說你可以在后端建立聯結表然后查詢它們。 這樣您就不必擔心在Ecto代碼中構建連接。 我希望這使我的答案更清楚一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM