【问题标题】:Doctrine Query Builder : Result returning array of two times the same resultDoctrine Query Builder:结果返回数组的两倍相同结果
【发布时间】: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


【解决方案1】:

我不知道为什么会这样,但是.. 我认为您必须提到 from() 之类的 ->from('User', 'u') 如需更多信息,您可以找到here

【讨论】:

    【解决方案2】:

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

    首先,连接不正确。我的目标是收集在他们自己的表中具有特定值的用户,以及来自 Tag 表的值。使用左连接,我正在收集具有自己值或标签表中的值的用户。

    第二:我传递的 $app 值是 Application 类型的对象(我的 User 表中的 Application 字段是外键),查询生成器不知道如何处理它。传递 app_id 而不是 app 对象解决了这个问题。

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

    感谢所有回复的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多