Riposto qui perchè la domanda è sempre sui repository personalizzati.
Sto creando i metodi per effettuare le mie query, ma non riesco a capire che differeza ci sia tra un metodo e un'altro.
Allora io ho 2 entity.
book e category.
Prendiamo come esempio la rotta che espone di dati del libro con la relativa cateogira in JOIN.
Codice PHP:
public function viewAction( $id )
{
/*
//1° test di ricerca
$book = $this->getDoctrine()
->getRepository('AcmeDemoBundle:Book')
->findOneByTitle("titolo modificato");
*/
/*
//2° test di ricerca
$book = $this->getDoctrine()
->getRepository('AcmeDemoBundle:Book')
->find($id);
$categoryName = $book->getCategoryId()->getName();
if (!$book) {
throw $this->createNotFoundException(
'Nessun libro presente nel database con l\'id '.$id
);
}
return $this->render(
'AcmeDemoBundle:Book:view.html.twig',
array(
'book' => $book,
'categoryName' => $categoryName
)
);
*/
//3° test di ricerca
$book = $this->getDoctrine()
->getRepository('AcmeDemoBundle:Book')
->findOneByIdJoinedToCategory($id);
$category = $book->getCategoryId();
return $this->render(
'AcmeDemoBundle:Book:view.html.twig',
array(
'book' => $book,
'category' => $category
)
);
}
Qui invece i metodi del BookRepository da analizzare
Codice PHP:
public function findOneByIdJoinedToCategory($id)
{
$query = $this->getEntityManager()
->createQuery(
'SELECT book, cat FROM AcmeDemoBundle:book book
JOIN book.category_id cat
WHERE book.id = :id'
)->setParameter('id', $id);
try {
return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
Il 2° test di ricerca fa affidamento ad metodo find (Ho capito che si tratta di un metodo default che effettua la ricerca in base alla chiave che doctrine ha dell'orm, ma mi piacerebbe sapere dove sono questi metodi... ma va be....).
Comunque prima di passare il tutto alla vista, io devo eseguire il metodo :
$book->getCategoryId()->getName();
Per avere il nome almeno il nome della categoria, oppure
$book->getCategoryId();
Se voglio avere l'oggetto.
Cito da documentazione
"Ovviamente, se si sa in anticipo di aver bisogno di accedere a entrambi gli oggetti, si può evitare la seconda query, usando una join nella query originale. Aggiungere il seguente metodo alla classe ProductRepository:"
Percui ho costruito il metodo findOneByIdJoinedToCategory che effettua la join.
Pero devo sempre eseguire il metodo
$category = $book->getCategoryId();
Per ottenere i dati della categoria.
Dove sta il risparmio della query scuate?????