[英]Query a ManyToMany relation and display the good result in Symfony with 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
:class Categories的代碼
{
/**
* @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 ...靠近'categories':錯誤:無效的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
。 您無法使用整數均衡對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.