💧🔎⏳Elixir: 사전 로드와 사전 로드를 사용하는 것과 다른 점은 무엇입니까?
9212 단어 ectodatabaseelixirbraziliandevs
Vamos buscar os posts com seus commentários:
예를 들어 com preload
from(p in Post, preload: [:comments]) |> Repo.all()
우
Post
|> preload([:comments])
|> Repo.all
결과:
예를 들어 acima buscou todas as postagens do banco de dados e, em seguida, fez uma Consulta separada retornando todos os comentários associados às postagens fornecidas. Os comentários foram processados e associados a cada post sendo retornados no campo comments
.
관찰자 폰토스:
from(p in Post, preload: [:comments]) |> Repo.all()
Post
|> preload([:comments])
|> Repo.all
Exemplo com preload e 조인
Muitas vezes, você pode querer que postagens e comentários sejam selecionados e filtrados na mesma Consulta. Para esses casos, você pode dizer 명시적 que uma junção existente seja pré-carregada no conjunto de resultados:
Repo.all(
from p in Post,
join: c in assoc(p, :comments),
preload: [comments: c]
)
우
Post
|> join(:inner, [p], c in assoc(p, :comments))
|> preload([:comments])
|> Repo.all()
# ou
Post
|> join(:inner, [p], c in Comment, on: p.id == c.post_id)
|> preload([:comments])
|> Repo.all()
결과:
uma 쿼리 usando SQL과 유사한 결과:
관찰자 폰토스:
Repo.all(
from p in Post,
join: c in assoc(p, :comments),
preload: [comments: c]
)
Post
|> join(:inner, [p], c in assoc(p, :comments))
|> preload([:comments])
|> Repo.all()
# ou
Post
|> join(:inner, [p], c in Comment, on: p.id == c.post_id)
|> preload([:comments])
|> Repo.all()
Podemos corrigir a duplicação usando o
distinct
:Repo.all(
from p in Post,
distinct: true,
join: c in assoc(p, :comments),
preload: [comments: c]
)
우
Post
|> distinct(true)
|> join(:inner, [p], c in assoc(p, :comments))
|> preload([:comments])
|> Repo.all()
결과:
Agora temos apenas os posts que possuem commentários.
Selecionando os campos는 사전 로드를 수행합니다.
Para melhorar o nosso desempenho, ao invés de trazer todos os campos do comentário, podemos selecionar os campos que queremos:
comments_query =
Comment
|> select([c], c.body)
Post
|> distinct(true)
|> join(:inner, [p], c in assoc(p, :comments))
|> preload(comments: ^comments_query)
|> Repo.all()
결과:
결론
O preload sem join buscará todas as postagens do banco de dados e, em seguida, fará uma Consulta separada retornando todos os comentários associados às postagens fornecidas. Já usando preload com join em vez de emitir uma Consulta separada para buscar comentários, o Ecto buscará postagens e comentários em uma única Consulta e, em seguida, fará uma passagem separada associando cada comentário à postagem pai.
Reference
이 문제에 관하여(💧🔎⏳Elixir: 사전 로드와 사전 로드를 사용하는 것과 다른 점은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/maiquitome/elixir-qual-a-diferenca-de-usar-so-preload-e-preload-com-join-2aa4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
comments_query =
Comment
|> select([c], c.body)
Post
|> distinct(true)
|> join(:inner, [p], c in assoc(p, :comments))
|> preload(comments: ^comments_query)
|> Repo.all()
O preload sem join buscará todas as postagens do banco de dados e, em seguida, fará uma Consulta separada retornando todos os comentários associados às postagens fornecidas. Já usando preload com join em vez de emitir uma Consulta separada para buscar comentários, o Ecto buscará postagens e comentários em uma única Consulta e, em seguida, fará uma passagem separada associando cada comentário à postagem pai.
Reference
이 문제에 관하여(💧🔎⏳Elixir: 사전 로드와 사전 로드를 사용하는 것과 다른 점은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maiquitome/elixir-qual-a-diferenca-de-usar-so-preload-e-preload-com-join-2aa4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)