Doctrine查询生成器:结果返回两倍相同的结果数组
我目前正在使用Doctrine来管理实体的Symfony项目。Doctrine查询生成器:结果返回两倍相同的结果数组
我有一个名为User的表,其中包含几列,然后是另一个名为Tag的表,其中包含该用户表的一个外键,该表具有基于用户标识的ManyToOne关系,以及另一个名为value的列。
在我的应用程序中,我需要查找用户列表,具体取决于标记行之一和用户列之一的值。让我们继续:
选择user.value等于某个值的所有用户AND 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数组,它是我想要的,它返回一个User数组数组。第一个数组总是包含两个条目,而这两个条目总是相同的:它们是我需要的数组,没有一个区别。
我试图做返回$ users [0]而不是用户,然后我可以操纵我的用户实体的预期方式。我可以保持这种方式,因为它工作,但我真的很想知道为什么它返回一个不需要的数组数组而不是我想要的数组。这可能是我的查询,但我不知道如何修改它以获取我想要的用户。
任何线索为什么它的行为将真正赞赏,因为我还在学习教义。谢谢 !编辑²:没关系,这个查询看起来完全不正确,因为我根据$ app值得到所有用户,但它似乎从不检查标记表中是否存在一行,其值与somevalue相关联用户表的外键..
后几小时的调整,我用PhpMyAdmin上的SQL语句计算出来,所以我可以注意到有很多事情我做错了:
首先,连接不正确。我的目标是收集在自己的表中具有特定值的用户,以及来自Tag表的值。使用左连接,我用自己的值或标签表中的值收集用户。
第二:我传递的$ app值是一个Application类型的对象(我的User表中的Application字段是一个外键),查询构建器不知道如何处理它。传递app_id而不是应用程序对象解决了问题。
第三:我收集结果的方式错了。显然,这个查询返回一个User对象的数组。当我连续多次执行此查询时,我有一个数组,我使用array_push来填充数据,认为将数组array1推入array1会将array2的值放入数组1中,但它只是将数组2放入数组1中,导致该阵列是最初的问题。使用array_merge而不是array_push,我现在能够将查询中的所有结果收集到一个数组中。有一点array_unique,以避免冗余,一切都按预期工作。
感谢大家回复!
“从Tag表开始,选择值等于somevalue的所有行并且User.someColumn等于anothervalue,然后从这些行中返回User元素。”你想要一个用户的结果,但你选择了奇怪的标签(在getRepository中)。而且,我猜你的功能在你的控制器中?我强烈建议您使用自定义存储库类:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes – Elyass
@Elyass查看我更新的问题:更改了直接从用户表。现在你说出来了,我做了一个奇怪的方法。现在我不需要做Select('u'),因为我从它开始。但问题没有改变,使用上面的方法,我得到一个数组数组,第二个数组包含我需要的东西。使用返回$ users [0]而不是$ users,我可以做我需要的。但我真的想知道为什么发送两次相同结果的数组,而不是direclty返回结果..哦,这种方法不是在控制器中,而是在我的UserRepository.php中。 :) – YumeYume
我看到你解决了你的问题:)。我仍然想要添加一些精确性:如果你在你的用户仓库中,你不需要执行'$ em = $ this-> getEntityManager()',你可以直接使用'$ this - > _ em '(注意下划线)。然后,'getRepository'也不需要,你就在这个仓库中。你可以简单地用'$ qb = $ this-> createQueryBuilder('u')'开始查询 – Elyass