Запросите отношение ManyToMany и покажите хороший результат в Symfony с Doctrine

чтобы узнать, как это работает, на веб-сайте Stack есть неотвеченный вопрос, и обратите внимание, что у меня есть аналогичная проблема.

В моей базе данных SQl у меня есть две таблицы: Объявления и категории

Действительно, таблица Adverts может содержать Categories MANY , и, конечно, Category может быть во многих Adverts .

Поэтому у меня есть отношение ManyToMany между двумя таблицами. в SQL, Doctrine создает мне сводную таблицу с именем adverts_categories. Пока нет проблем, все теоретически правильно.

Итак, в моей базе данных SQl у меня есть три таблицы: adverts , adverts и categories :

  adverts +-------------+--------------+ | id | int(11) | | ... | ... | +-------------+--------------+ adverts_categories +---------------+--------------+ | adverts_id | int(11) | | categories_id | int(11) | +---------------+--------------+ categories +-------------+-------------+ | id | int(11) | | ... | ... | +-------------+-------------+ 

И в моем проекте Symfony, в моей папке сущности, у меня есть только две сущности, Adverts.php и Categories.php , что теоретически правильно и сейчас.

Вот код для Adverts.php :

 class Adverts { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var \Users * * @ORM\ManyToOne(targetEntity="Users") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="users_id", referencedColumnName="id") * }) */ private $users; /** * @var \Doctrine\Common\Collections\Collection * * @ORM\ManyToMany(targetEntity="Categories", inversedBy="adverts") * @ORM\JoinTable(name="adverts_categories", * joinColumns={ * @ORM\JoinColumn(name="adverts_id", referencedColumnName="id") * }, * inverseJoinColumns={ * @ORM\JoinColumn(name="categories_id", referencedColumnName="id") * } * ) */ private $categories; 

И вот код для Categories.php : Категории классов

 { /** * @var integer * * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var \Doctrine\Common\Collections\Collection * * @ORM\ManyToMany(targetEntity="Adverts", mappedBy="categories") */ private $adverts; 

Итак, теперь, когда я пытаюсь сделать запрос, чтобы получить результаты этого запроса, произошла ошибка. Вот код моего контроллера:

 public function indexAdvertsAction() { $em=$this->getDoctrine()->getManager(); $advert= $em->getRepository('MySpaceMyBundle:Adverts'); $queryAdverts = $em->createQuery('SELECT a FROM MySpaceMyBundle:Adverts a, MySpaceMyBundle:Users u, MySpaceMyBundle:Categories c WHERE a.categories = c.id AND a.users = a.id '); $advert= $queryAdverts->getResult(); return $this->render('MySpaceMyBundle:MyFolder:indexAdverts.html.twig', array('advert' => $advert )); } 

Ошибка:

[Семантическая ошибка] line …, col … near 'categories': Ошибка: Invalid PathExpression. StateFieldPathExpression или SingleValuedAssociationField ожидается.

Я действительно не понимаю. Кто-то может помочь?


UPADTE

если это может помочь найти ответ, я хотел бы отобразить весь результат в a в моем indexAdverts.html.twig , вот код:

 {% for adverts in advert%} <tr> <td>{{ adverts.id }}</td> <td>{{ adverts.name }}</td> <td>{{ adverts.users }}</td> <td>{{ adverts.categories }}</td> <td><a href="{{ path('editAdverts', {'name': adverts.name}) }}"><button class="btn btn-warning btn-xs">Edit</button></a></td> </tr> {% endfor %} 

Вы не должны использовать DQL или другие прямые запросы в своих контроллерах, если это действительно не нужно. Вы должны сделать это:

 public function indexAdvertsAction() { $em=$this->getDoctrine()->getManager(); $adverts = $em->getRepository('MySpaceMyBundle:Adverts')->findAll(); return $this->render( 'MySpaceMyBundle:MyFolder:indexAdverts.html.twig', array('adverts' => $adverts ) ); } 

Затем в вашем шаблоне объект объявления позаботится об остальном, благодаря правильному отображению отношений:

 {% for adverts in advert%} <tr> <td>{{ adverts.id }}</td> <td>{{ adverts.name }}</td> <td>{{ adverts.users }}</td> <td> {% for category in adverts.categories %} {{ adverts.categories }} {% endfor %} </td> <td> <a href="{{ path('editAdverts', {'name': adverts.name}) }}"><button class="btn btn-warning btn-xs">Edit</button></a> </td> </tr> {% endfor %} 
 WHERE a.categories = c.id 

Эта строка должна вызывать ошибку. Я думаю, что в вашем случае вы должны использовать a.categories.id вместо a.categories . Вы не можете выравнивать объект с целым числом.