簡體   English   中英

查詢ManyToMany關系並在Symfony中使用Doctrine顯示良好的結果

[英]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數據庫中,我有三個表: advertsadverts_categoriescategories如下:

    adverts
+-------------+--------------+
| id          | int(11)      |
| ...         | ...          |
+-------------+--------------+

    adverts_categories 
+---------------+--------------+
| adverts_id    | int(11)      |
| categories_id | int(11)      |
+---------------+--------------+

    categories
+-------------+-------------+
| id          | int(11)     |
| ...         | ...         |
+-------------+-------------+

在我的Symfony項目中,在我的實體文件夾中,我只有兩個實體名稱Adverts.phpCategories.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM