使用 Doctrine 查询 ManyToMany 关系并在 Symfony 中显示良好的结果
Query a ManyToMany relation and display the good result in Symfony with Doctrine
为了了解它到底是如何工作的,Stack 网站上有一个 问题,请注意我也有类似的问题。
在我的 SQl 数据库 中,我有两个 table:Adverts 和 类别
的确,Adverts
table可以包含MANYCategories
,当然一个Category
可以包含很多Adverts
.
所以我在两个 table 之间有一个 ManyToMany 关系。在 SQL 中,Doctrine 为我创建了一个名为 adverts_categories 的支点 table。到目前为止没有问题,理论上一切都是正确的。
因此,在我的 SQl 数据库中,我有三个 table: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
的代码:
class 类别
{
/**
* @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 ));
}
错误是:
[Semantical Error] line ..., col ... near 'categories': Error: Invalid
PathExpression. StateFieldPathExpression or
SingleValuedAssociationField expected.
我真的不明白。有人可以帮忙吗?
更新
如果它可以帮助搜索答案,我想在我的树枝 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 %}
WHERE a.categories = c.id
这一行应该会导致错误。我认为在你的情况下,你应该使用 a.categories.id
而不是 a.categories
。
你不能用整数来平衡一个对象。
如果不是真的需要,您不应该在您的控制器中使用 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 %}
为了了解它到底是如何工作的,Stack 网站上有一个
在我的 SQl 数据库 中,我有两个 table:Adverts 和 类别
的确,Adverts
table可以包含MANYCategories
,当然一个Category
可以包含很多Adverts
.
所以我在两个 table 之间有一个 ManyToMany 关系。在 SQL 中,Doctrine 为我创建了一个名为 adverts_categories 的支点 table。到目前为止没有问题,理论上一切都是正确的。
因此,在我的 SQl 数据库中,我有三个 table: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
的代码:
class 类别
{
/**
* @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 ));
}
错误是:
[Semantical Error] line ..., col ... near 'categories': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
我真的不明白。有人可以帮忙吗?
更新
如果它可以帮助搜索答案,我想在我的树枝 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 %}
WHERE a.categories = c.id
这一行应该会导致错误。我认为在你的情况下,你应该使用 a.categories.id
而不是 a.categories
。
你不能用整数来平衡一个对象。
如果不是真的需要,您不应该在您的控制器中使用 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 %}