Получить данный выбор на основе связанного поля таблицы - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в Symfony (используйте SF5). есть таблица комментариев, внутри которой находится столбец filmId, который имеет отношение типа с основным идентификатором, как вы можете себе представить, таблицы фильмов. На данный момент я получаю фильм на странице в соответствии с его идентификатором и получаю все комментарии независимо от идентификатора фильма:

/**
 * @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 чтобы узнать немного больше. Мне возвращается, что filmId имеет тип PersistentCollection. Я хотел бы получить комментарии, указанные c для каждого фильма в соответствии с filmId.

Я пытался получить их с помощью $ comments = $ comRepo-> findBy ($ id) ( так как идентификатор фильма, который я получаю в GET, - это то, что я хочу для filmId), он дает мне нераспознанное поле ошибка.

Следуя документации, я попытался создать пользовательский запрос, подобный этому:

//CommentRepository
public function findAllWithFilmId($filmId) 
    {
        $em = $this->getEntityManager();

        $query = $em->createQuery(
            'SELECT c
            FROM App\Entity\Comment c
            WHERE c.filmId = :filmId'
        )->setParameter('filmId', $filmId);

        return $query->getResult();
    }
//FilmController
 $filmId = $id;
 $comments = $this->getDoctrine()
    ->getRepository(Comment::class)
    ->findAllWithFilmId($filmId);

Но я получаю следующую ошибку:

[Семантическая ошибка] строка 0, столбец 67 рядом с 'filmId =: fi': Ошибка: неверное выражение пути , Ожидается StateFieldPathExpression или SingleValuedAssociationField.

Что не так? Когда filmId определяется как: fi? А как правильно создать запрос по FilmId?

1 Ответ

2 голосов
/ 25 марта 2020

Первая ошибка $comments = $comRepo-> findBy($id) из-за того, что при вызове findBy необходимо отправить массив. Документация

В вашем случае вы хотите найти по Id, поэтому оно должно быть следующим:

$comments = $comRepo->findBy(array('id' => $id));

Также вы можете позвонить findById, который ожидает только Параметр id.

$comments = $comRepo->findById($id);

Примечание: как сказал @El_Vanja, вы можете использовать QueryBuilder, но IMO не нужен для простого запроса, похожего на этот.

...