чтобы узнать, как это работает, на веб-сайте 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
. Вы не можете выравнивать объект с целым числом.