如何通过 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
)
我认为这证明了您所描述的关系类型。希望对您有所帮助!
我想通过 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
)
我认为这证明了您所描述的关系类型。希望对您有所帮助!