【发布时间】:2016-07-04 14:51:57
【问题描述】:
我目前正在做一个 Symfony 项目,使用 Doctrine 来管理实体。
我有一个名为 User 的表,其中包含几列,然后是另一个名为 Tag 的表,其中包含该 User 表的外键,该表具有基于用户 id 的 ManyToOne 关系,以及一个名为 value 的其他列。
在我的应用程序中,我需要根据标签行之一和用户列之一的值来查找用户列表。让我们继续:
选择 user.value 等于某个值 AND Tag.value 等于另一个值的所有用户。
由于在这个项目之前我从未使用过 Symfony 或 Doctrine,因此我搜索了 Doctrine 文档并找到了有关查询生成器的信息。所以,我做到了:
编辑:我这样做的方式有点奇怪,所以我对其进行了修改,结果如下:
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;
}
它似乎有效,但方式很奇怪。它不是返回我想要的用户项数组,而是返回一个用户项数组。第一个数组总是包含两个条目,这两个条目总是相同的:它们是我需要的数组,没有任何区别。
我尝试返回 $users[0] 而不仅仅是用户,然后我可以按照预期的方式操作我的用户实体。我可以在它工作时保持这种方式,但我真的很想知道为什么它返回一个不需要的数组而不是我想要的数组。这可能是我的查询,但我不确定如何修改它以仅获取我想要的用户。
任何关于它为什么会这样表现的线索都会非常感激,因为我还在学习 Doctrine。谢谢 !
EDIT²:没关系,这个查询似乎也完全不正确,因为我根据 $app 值获取了所有用户,但它似乎从不检查 Tag 表中是否存在与某个值关联的行用户表的外键..
【问题讨论】:
-
"从 Tag 表开始,选择 value 等于 somevalue AND User.someColumn 等于 anothervalue 的所有行,然后从这些行中返回 User 元素。"您想要用户的结果,但您选择了奇怪的标签(在 getRepository 中)。此外,我猜您的功能在您的控制器中?我强烈建议您使用自定义存储库类:symfony.com/doc/current/book/…
-
@Elyass 查看我更新的问题:将方法更改为直接从用户表开始。既然你这么说,我就是用一种奇怪的方式来做这件事。现在我不需要做 Select('u'),因为我从它开始。但是问题没有改变,使用上述方法,我得到了一个数组数组,第二个数组包含了我需要的内容。使用 return $users[0] 而不是 $users,我可以做我需要的。但我真的很想知道为什么要发送一个包含两次相同结果的数组,而不是直接返回结果。哦,这个方法不在控制器中,而是在我的 UserRepository.php 中。 :)
-
我看到你解决了你的问题:)。我仍然想添加一些精确度:如果您在用户存储库中,则无需执行
$em = $this->getEntityManager(),您可以直接使用$this->_em访问变量(注意下划线)。然后,getRepository也不需要,您在该存储库中。您可以简单地使用$qb = $this->createQueryBuilder('u')开始您的查询
标签: php arrays doctrine-orm symfony query-builder