1
resposta

[Dúvida] Carregar apenas entidades que possuem relacionamento.

Boa tarde,

Acabei migrando do Laravel para o Symfony, pois comecei a discordar de algumas coisas que o Laravel faz (uma delas seria sujar a entidade com detalhes do framework).

No entanto, o Laravel (mais especificamente o Eloquent) possui alguns métodos interessantes, como o User::has(Post::class) ou User::with(Post::class).

  • has (carrega os usuários que possuem pelo menos um post).
  • with (carrega os posts via EAGER LOAD). Esses métodos são bastante úteis. Fiz algumas pesquisas e não encontrei nada parecido... Realmente, não existe isso no Doctrine? Caso exista alguma lib/pacote que pudesse ajudar.

Caso não, se puder dar um norte de como implementar, seria de grande ajuda.

1 resposta

Olá Guilherme, tudo bem?

No Doctrine, que é o ORM padrão usado com Symfony, as funcionalidades que você mencionou, como has e with, podem ser alcançadas, mas de maneira um pouco diferente.

Para replicar a funcionalidade de has (carregar usuários que possuem pelo menos um post), você pode usar o DQL (Doctrine Query Language) para fazer uma consulta que filtre os usuários baseado na existência de posts relacionados. Aqui está um exemplo de como você poderia fazer isso:

$query = $entityManager->createQuery('SELECT u FROM User u WHERE u.posts IS NOT EMPTY');
$usersWithPosts = $query->getResult();

Este código seleciona todos os usuários que têm pelo menos um post associado.

Quanto à funcionalidade de with para carregar os posts via EAGER LOADING, o Doctrine permite definir isso diretamente na anotação da entidade. Por exemplo, se você tem uma relação entre User e Post, você pode configurar o carregamento antecipado (EAGER LOADING) na definição da entidade:

/** @Entity */
class User
{
    // ...

    /**
     * @OneToMany(targetEntity="Post", mappedBy="user", fetch="EAGER")
     */
    private $posts;

    // ...
}

Com isso, sempre que você carregar um User, seus Posts relacionados serão carregados automaticamente.

Caso essas soluções não sejam suficientes e você esteja procurando por algo mais específico ou flexível, você pode considerar criar um repositório personalizado para a sua entidade e adicionar métodos que encapsulem essas lógicas de consulta específicas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.