Doctrine Query Builder:结果返回相同结果两倍的数组

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

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

我有一个名为 table 的用户,其中包含几列,然后是另一个名为 table 的标签,其中包含该用户 table 的外键,该用户具有基于多对一的关系用户 ID,以及一个名为值的其他列。

在我的应用程序中,我需要找到一个用户列表,具体取决于其中一个标签行和用户列之一的值。让我们继续:

Select 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;
}

它似乎有效,但以一种奇怪的方式。我想要的不是 return 用户项数组,而是 return 用户项数组。第一个数组总是包含两个条目,这两个条目总是相同的:它们是我需要的数组,没有任何区别。

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

如果能提供任何关于它为什么会这样的线索,我将不胜感激,因为我仍在学习 Doctrine。谢谢 !

EDIT²:没关系,这个查询似乎也完全不正确,因为我根据 $app 值获得了所有用户,但它似乎从不检查标签 table 中是否有一行带有与用户的外键关联的某个值的值 table..

我不知道为什么会这样,但是.. 我想你必须像 ->from('User', 'u') 一样提到 from() 额外的你可以找到 here

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

首先,连接不正确。我的目标是收集在自己 table 中具有特定价值,并且在标签 table 中具有一定价值的用户。使用左连接,我使用自己的值或标签 table 中的值收集用户。

其次:我传递的 $app 值是一个 Application 类型的对象(我的 User table 中的 Application 字段是一个外键),查询构建器不知道如何处理它。传递 app_id 而不是 app 对象解决了问题。

第三:我收集结果的方式不对。显然,这个查询 returns 一个 User 对象数组。当我连续多次执行此查询时,我有一个数组,我在该数组上使用 array_push 来填充数据,认为用 array2 推送 array1 会将 array2 值放入 array1,但它只是把array2 到 array1,结果是最初的问题所在的数组。使用 array_merge 而不是 array_push,我现在能够将查询的所有结果收集到一个数组中。稍微 array_unique 以避免冗余,一切都按预期工作。

感谢大家的回复!