1
resposta

Sobre método getReference(já olhei respostas anteriores no fórum)

Boa tarde. Eu vi uma resposta anterior aqui no fórum sobre o método getReference() e ainda não entendi. Fizemos o seguinte:

$aluno = $entityManager->getReference(Aluno::class, $id);

$entityManager->remove($aluno);

$entityManager->flush();

O professor falou que o método getReference() cria uma entidade que o doctrine já gerencie, mas que só tenha a informação do id passado /pois o doctrine não vai no banco para buscar. Se criarmos um aluno do zero sem salvar no banco, o remove não funciona porque nao é uma entidade gerenciada pelo doctrine. Porém não entendi muito bem como ele não vai no banco. Como ele faz para saber que aquela entidade passada é alguém que ele gerencie? Porque o professor deu o exemplo depois instanciando um aluno

$aluno = new Aluno();
$aluno->setId(2);
$entityManager->remove($aluno);

Ele disse que isso não funcionaria porque o Doctrine não gerencia essa entidade então entendi que era porque não estava salva no banco porque a classe Aluno o doctrine gerencia sim.

1 resposta

Oi Karolina! Tudo bem?

A função do método getReference() no Doctrine é criar uma entidade que o Doctrine já gerencie, mas que tenha apenas a informação do ID passado. Dessa forma, o Doctrine não precisa fazer uma consulta ao banco de dados para buscar os outros dados da entidade.

Quando você utiliza o método getReference() passando a classe Aluno e o ID, o Doctrine cria uma entidade do tipo Aluno com apenas o ID preenchido. Essa entidade é gerenciada pelo Doctrine, mas não possui as outras informações do aluno, como nome, por exemplo.

Dessa forma, quando você chama o método remove() passando essa entidade, o Doctrine sabe que se trata de uma entidade gerenciada por ele e realiza a remoção no banco de dados.

No exemplo que você mencionou, em que o professor instanciou um aluno e chamou o método remove(), o motivo pelo qual não funcionou é porque essa entidade não foi gerenciada pelo Doctrine. Como você disse, o Doctrine gerencia a classe Aluno, mas apenas quando ela está persistida no banco de dados. Quando você cria uma instância de Aluno e define apenas o ID, o Doctrine não sabe que essa entidade deve ser gerenciada por ele.

Portanto, ao utilizar o método getReference(), você está garantindo que o Doctrine gerencie a entidade corretamente, mesmo sem buscar todas as informações no banco de dados.

Espero ter ajudado!

Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software