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 以避免冗余,一切都按预期工作。
感谢大家的回复!
我目前正在做一个 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 以避免冗余,一切都按预期工作。
感谢大家的回复!