我目前正在开发一个Symfony项目,使用Doctrine来管理实体。
我有一个名为User的表,包含几个列,然后是另一个名为Tag的表,其中包含一个具有基于用户ID的ManyToOne关系的User表的外键,以及一个名为value的其他列。
在我的应用中,我需要找到一个用户列表,具体取决于其中一个标记行,以及其中一个用户列的值。让我们继续:
选择user.value等于somevalue且Tag.value等于anothervalue的所有用户。
由于我在此项目之前从未使用过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]而不仅仅是用户,然后我可以按照预期的方式操作我的用户实体。我可以保持这种方式,因为它工作,但我真的想知道为什么它返回一个不需要的数组数组而不是我想要的数组。它可能是我的查询,但我不知道如何修改它只获得我想要的用户。
为什么它表现得像这样的任何线索都会非常感激,因为我还在学习Doctrine。谢谢 !
EDIT²:没关系,这个查询似乎也完全不正确,因为我根据$ app值得到了所有用户,但似乎它永远不会检查Tag表中是否有一行值与some值相关联用户表的外键..
答案 0 :(得分:0)
我不知道为什么会这样但是......
我想你必须提及()"<img src= '$F{Image}' align='left'/> <p>"+$F{KN_Zusatzinfo_DV_Einleitungstext} +"</p>"
您还可以找到here
答案 1 :(得分:0)
经过几个小时的调整后,我在PhpMyAdmin上使用SQL语句想出来了,所以我注意到有很多事情我做错了:
首先,加入不正确。我的目标是收集在自己的表中具有特定值的用户,以及来自Tag表的值。使用左连接,我收集了具有自己值的用户或来自Tag表的值。
第二:我传递的$ app值是Application类型的对象(我的User表中的Application字段是外键),查询构建器不知道如何处理它。传递app_id而不是app对象解决了这个问题。
第三:我收集结果的方式是错误的。显然,此查询返回一个User对象数组。当我连续多次执行此查询时,我有一个数组,我使用array_push来填充数据,认为使用array2推送array1会将array2值放入array1,但它只是将array2放入array1,导致该阵列数组成为最初的问题。使用array_merge而不是array_push,我现在能够将查询中的所有结果收集到一个数组中。一个小的array_unique,以避免冗余,一切都按预期工作。感谢所有回复的人!