для того, чтобы узнать, как это действительно работает, есть оставшийся без ответа вопрос с сайта Stack, и обратите внимание, что у меня похожая проблема.
В моем База данных SQl, У меня есть две таблицы: Объявления а также категории
Действительно, Adverts
таблица может содержать МНОГО Categories
и, конечно же, Category
может быть во многих Adverts
,
Итак, у меня есть ManyToMany связь между двумя таблицами. в SQL Doctrine создает сводную таблицу с именем adverts_categories. Пока проблем нет, все теоретически правильно.
Итак, в моей базе данных SQl у меня есть три таблицы: adverts
, adverts_categories
а также 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 … рядом с ‘категориями’: Ошибка: недействительно
PathExpression. StateFieldPathExpression или
Ожидается SingleValuedAssociationField.
Я действительно не понимаю. Кто-то может помочь?
UPADTE
если бы это могло помочь в поиске ответа, я бы хотел отобразить все результаты в моей ветке 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
,
Вы не можете выровнять объект с целым числом.