【问题标题】:Create composable query for many_to_many association为 many_to_many 关联创建可组合查询
【发布时间】:2018-11-05 05:49:34
【问题描述】:

我正在尝试创建一个可组合的 ecto 查询,以列出特定 Contributor 的所有 Document。我希望 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

【问题讨论】:

    标签: phoenix-framework ecto


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2016-06-18
      • 2017-04-29
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多