I’m beginner at Symfony (use SF5). have a comments table, inside which is a filmId column, which is of type relation with the primary id of, you can imagine, the film table. For the moment I get a film on a page according to its id, and get all the comments, no matter the id of the film:
/** * @Route("/user/film/{id}", name="film") */ public function film(FilmRepository $repo, CommentRepository $comRepo, EntityManagerInterface $em, Request $req, $id) { $film = $repo->find($id); $comments = $comRepo->findAll(); dump($comments); return $this->render('film/film.html.twig', [ 'controller_name' => 'FilmController', 'film' => $film, 'comments' => $comments ]); }
I dump() $comments to find out a little more. It returns to me that filmId is of type PersistentCollection. I would like to retrieve the comments specific to each film according to filmId.
I tried to retrieve them by a $comments = $comRepo-> findBy($id) (since the id of the film I get in GET is what I want for the filmId), it gives me a nice unrecognized field error.
Following the documentation, I tried to create a custom query like this:
//CommentRepository public function findAllWithFilmId($filmId) { $em = $this->getEntityManager(); $query = $em->createQuery( 'SELECT c FROM AppEntityComment c WHERE c.filmId = :filmId' )->setParameter('filmId', $filmId); return $query->getResult(); } //FilmController $filmId = $id; $comments = $this->getDoctrine() ->getRepository(Comment::class) ->findAllWithFilmId($filmId);
But I get the following error:
[Semantical Error] line 0, col 67 near ‘filmId =: fi’: Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
What’s wrong ? When is filmId defined as :fi? And how to create a correct request according to the filmId?
Advertisement
Answer
The first error $comments = $comRepo-> findBy($id)
is beacuse when calling findBy
you need to send an array. Documentation
In your case, you want to find by Id so it should be as following:
$comments = $comRepo->findBy(array('id' => $id));
Also you can call findById
which expects only the id parameter.
$comments = $comRepo->findById($id);
Note: as @El_Vanja said, you can use the QueryBuilder, but IMO it is unnecesary for a simple query llike this one.