为多对多关联创建可组合查询

时间:2018-11-04 14:44:17

标签: phoenix-framework ecto

我正在尝试创建可组合的ecto查询,以列出特定Document的所有Contributor。我希望api看起来像这样:

Document
|> Document.for_contributor(contributor)
|> Repo.all()

但是我对从哪里开始感到迷茫。在has_many关系中,Contributor可能有很多Document之前和之前,我一直在进行可组合查询,我会这样做:

  def for_contributor(query, %Contributor{} = contributor) do
    from(document in query, where: document.contributor_id == ^contributor.id)
  end

但是我不确定如何进行类似但具有many_to_many关系的事情。

我的for_contributor函数会发生什么?

defmodule MyApp.Document do
  use Ecto.Schema
  import Ecto.Changeset

  alias MyApp.Contributor

  schema "documents" do
    many_to_many(:contributors, Contributor, join_through: "contributors_documents")
    timestamps()
  end

  def for_contributor(query, %Contributor{} = contributor) do
    # ???
  end
end

我的联接表如下:

defmodule MyApp.Repo.Migrations.CreateContributorsDocuments do
  use Ecto.Migration

  def change do
    create table(:contributors_documents, primary_key: false) do
      add :contributor_id, references(:contributors)
      add :document_id, references(:documents)
    end
  end
end

1 个答案:

答案 0 :(得分:1)

我的头脑变得比原来复杂得多。我用一个简单的join解决了这个问题。

  def for_contributor(query, %Contributor{} = contributor) do
    from(
      document in query,
      join: c in assoc(document, :contributors),
      where: c.id == ^contributor.id
    )
  end