为了了解它是如何工作的,stack网站上有一个unanswered问题,请注意我也有类似的问题。
在我的sql数据库中,我有两个表:广告和类别
实际上,Adverts
表可以包含许多Categories
,当然aCategory
可以包含在许多Adverts
中。
所以这两张桌子之间有很多关系。在SQL中,Doctrine为我创建了一个名为adverts\u 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 ));
}
错误是:
[语义错误]行…,列…“类别”附近:错误:无效
路径表达式。StateFieldPathExpression或
需要SingleValuedAssociationField。
我真的不明白。有人能帮忙吗?
厄帕特
如果这有助于搜索答案,我想在我的小树枝中显示所有结果,下面是代码:
{% 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 %}