条令查询生成器:返回两次相同结果的结果数组


Doctrine Query Builder : Result returning array of two times the same result

我目前正在进行一个Symfony项目,使用Doctrine来管理实体。

我有一个名为User的表,其中包含一些列,还有另一个表名为Tag,其中包含该User表的外键,该表具有基于用户id的ManyToOne关系,还有一个其他名为value的列。

在我的应用程序中,我需要根据其中一个标记行和其中一个用户列的值来查找用户列表。让我们继续:

选择user.value等于某个值且Tag.value为另一个值的所有用户。

由于在这个项目之前我从未使用过Symfony或Doctrine,所以我搜索了Doctrine文档,找到了关于Query Builder的信息。所以,我做了这个:

编辑:我做这件事的方式有点奇怪,所以我修改了它,结果是:

public function findByTagAndApp($tag, $app)
{
    $em = $this->getEntityManager();
    $qb = $em
        ->getRepository('APIBundle:User')
        ->createQueryBuilder('u')
        ->leftJoin('APIBundle'Entity'Tag', 't')
        ->where('u.application = :app')
        ->andWhere('t.tag = :tag')
        ->setParameter('tag', $tag)
        ->setParameter('app', $app)
    ;
    $users = $qb->getQuery()->getResult();
    return $users;
}

它看起来很有效,但方式很奇怪。它不是返回一个User项的数组(这正是我想要的(,而是返回一个用户项的数组。第一个数组总是包含两个条目,这两个条目总是相同的:它们是我需要的数组,没有任何区别。

我尝试返回$users[0],而不仅仅是用户,然后我可以按预期方式操作我的User实体。我可以在它工作的时候保持这种方式,但我真的很想知道为什么它会返回一个不需要的数组,而不是我想要的数组。这可能是我的查询,但我不知道如何修改它以只获得我想要的用户。

任何关于它为什么会这样表现的线索都将不胜感激,因为我仍在学习教义。谢谢

EDIT²:无论如何,这个查询似乎也完全不正确,因为我根据$app值获得了所有用户,但它似乎从未检查Tag表中是否有一行的值为somevalue,该行与User表的外键关联。。

我不知道为什么,但。。我想你必须提到像->from('User', 'u')一样的from((如需额外信息,您可以在此处找到

经过几个小时的调整,我在PhpMyAdmin上使用SQL语句解决了这个问题,所以我可以注意到我做错了很多事情:

首先,联接不正确。我的目标是收集在自己的表中具有特定值的用户,以及Tag表中的值。使用左联接,我收集了具有自己的值或Tag表中的值的用户。

第二:我传递的$app值是一个Application类型的对象(我的User表中的Application字段是一个外键(,查询生成器不知道该怎么处理它。传递app_id而不是app对象解决了问题。

第三:我收集结果的方式不对。显然,这个查询返回一个User对象数组。当我连续多次执行这个查询时,我得到了一个数组,在这个数组上我使用array_push来填充数据,我认为用array2推送array1会将array2的值放入array1,但它只是将array2放入array1中,这导致了最初的问题。使用array_merge而不是array_push,我现在可以将查询的所有结果收集到一个数组中。为了避免冗余,这上面有一个小数组_唯一,一切都按预期进行。

感谢所有回复的人!