如何通过 Ecto Multi 从之前插入的 table 键中检索 ID

How to retrieve id from previous inserted table key by Ecto Multi

我想通过 Ecto Multi 从之前插入的 table 主键中检索 ID。

首先,我插入到A main table。然后 B 详细信息 table 需要 A.id。 我尝试了以下代码。

Multi.new()
  |> Multi.insert(:insert, main)
  |> Multi.insert_all(:insert_all, B, details)
  |> Repo.transaction()

但是我不知道如何检索 A.id 以插入 table B。 我应该为此做什么?

我认为你可以使用 Multi.merge 在第二个多重中使用第一个多重的结果。

这是文档中的示例:

multi =
  Ecto.Multi.new()
  |> Ecto.Multi.insert(:post, %Post{title: "first"})

multi
|> Ecto.Multi.merge(fn %{post: post} ->
  # Here, post is the Post inserted in the first multi.
  Ecto.Multi.new()
  |> Ecto.Multi.insert(:comment, Ecto.build_assoc(post, :comments))
end)
|> MyApp.Repo.transaction()

更新:我添加了关于在第一个 multi 中创建的 post(您的 A 模型)的评论。您可以使用 post.id 并将其分配给相关评论(您的 B 模型)。

您可以像下面的示例那样创建一个新的 User 记录和一个新的 Email 记录(其中 email 记录关联到父 user 通过 user_id 外键记录)。

alias Ecto.Multi

user = get_user_params_from_form() # <-- or where-ever you are getting data
email = get_email_params_from_form()

Multi.new()
    |> Multi.insert(:user, User.changeset(%User{}, user))
    |> Multi.insert(
      :email,
      # Capture the id from the previous operation
      fn %{
           user: %User{
             id: user_id
           }
         } ->
        Email.changeset(%Email{user_id: user_id}, email)
      end
    )

我认为这证明了您所描述的关系类型。希望对您有所帮助!