Php 查询多个关系并在Symfony中显示良好的结果

Php 查询多个关系并在Symfony中显示良好的结果,php,symfony,doctrine-orm,many-to-many,dql,Php,Symfony,Doctrine Orm,Many To Many,Dql,为了了解它是如何工作的,Stack网站提出了一个问题,请注意,我也遇到了类似的问题 在我的SQl数据库中,我有两个表:广告和类别 实际上,广告表可以包含多个类别,当然类别可以在多个广告中 因此,我在两个表之间有一个多个关系。在SQL中,Doctrine为我创建了一个名为adverts_categories的透视表。到目前为止没有问题,理论上一切都是正确的 因此,在我的SQl数据库中,我有三个表:adverts、adverts\u categories和categories,如下所示: a

为了了解它是如何工作的,Stack网站提出了一个问题,请注意,我也遇到了类似的问题

在我的SQl数据库中,我有两个表:广告类别

实际上,
广告
表可以包含多个
类别
,当然
类别
可以在多个
广告

因此,我在两个表之间有一个多个关系。在SQL中,Doctrine为我创建了一个名为adverts_categories的透视表。到目前为止没有问题,理论上一切都是正确的

因此,在我的SQl数据库中,我有三个表:
adverts
adverts\u 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

我真的不明白。有人能帮忙吗


厄帕德

如果有助于搜索答案,我想在my twig
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 %}
{%用于广告客户%中的广告客户]
{{adverts.id}
{{adverts.name}
{{adverts.users}
{{adverts.categories}
{%endfor%}
这一行应该会导致错误。我认为在您的情况下,应该使用
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 %}
{%用于广告客户%中的广告客户]
{{adverts.id}
{{adverts.name}
{{adverts.users}
{%用于广告中的类别。类别%}
{{adverts.categories}
{%endfor%}
{%endfor%}

可能其中a.categories=c.id应该是a.categories=c。看看这个问题的答案:你的建议不符合。此外,事实是我有很多亲戚。这就是为什么它会给我同样的错误。DQL与SQL有点不同,尤其是在连接方面。我还建议删除用户和where条件,直到您看到dql是如何工作的。@Cerad,我也尝试过这样的连接:
$queryAdverts=$em->createQuery('Selecta FROM MySpaceMyBundle:Adverts a,MySpaceMyBundle:Users u JOIN MySpaceMyBundle:Categories c其中a.Categories=c.id和a.Users=a.id')
我也有完全相同的错误为什么在可以直接在实体上使用getter的情况下使用repo?我当然会尝试,但如果我像你建议的那样,我会出现以下错误:
[语法错误]行…,列…:错误:预期=,=,!=,得到'。
否。DQL不是SQL。我已经尝试过了,事实上我在执行此操作时出现了此错误:
在呈现模板期间引发了异常(“可捕获的致命错误:在My\Path\of\My\Project\app\cache\dev\twig\bf\66\146a31a62bf6f2a549d2604fb5be9c4530ab760a10169af08e8a5b72e9ee.php行中,类条令\ORM\PersistentCollection的对象无法转换为字符串…”在MySpaceMyBundle:MyFolder:indexAdverts.html.twig的第行…
。导致此错误的那一行是我在my:
{{{adverts.categories}}
中插入的。这是因为您试图打印完整的关系,而不是循环它。我将编辑答案,包括一个模板示例
{% 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 %}