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

для того, чтобы узнать, как это действительно работает, есть оставшийся без ответа вопрос с сайта 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 %}

3

Решение

Вы не должны использовать 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 %}
3

Другие решения

WHERE a.categories = c.id

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

0

По вопросам рекламы [email protected]