Doctrine CreateQueryBuilder返回重复的结果

时间:2016-06-01 05:54:45

标签: doctrine-orm symfony

在Symfony3中我正在运行

php app/console generate:doctrine:entity --entity=AcmeBlogBundle:Post

它创建了2个文件:Post(在实体文件夹中)和PostRepository(在扩展\Doctrine\ORM\EntityRepository的存储库文件夹中)

在我尝试在我的控制器中运行以下repository-custom-function之前,一切都很好

$rir = $this->getDoctrine()->getRepository("AcmeBlogBundle:Post");
$replacementInstruction = $rir->getOneBy(
    array("id" => 6)
);

我的自定义存储库功能如下

public function getOneBy($option)
{
    $alias = "p";
    $fields = $this->prepareRequestSelectFields("p");

    $qb = $this->createQueryBuilder('Post');

    $qb->select($fields)
        ->from('AcmeBlogBundle:Post', $alias)
        ->where($alias . '.id = :id')
        ->setParameter('id', 6)
    ;

    $result = $qb->getQuery()->getResult();
}

private function prepareRequestSelectFields($alias)
{
    return  $alias. ".id";
}

在我的数据库中有10个帖子的id为1到10,所以我希望它返回1个结果,但是它返回正确的帖子(id 6)10次

为什么?

P.S。如果我将查询构建器移动到自定义服务包装器,例如PostManager它工作正常(返回1)

3 个答案:

答案 0 :(得分:0)

这并没有真正回答我的问题,但显然createQueryBuilder() EntityRepositoryEntityManager中的... $qb = $this->createQueryBuilder('p'); // this should be the alias $qb->select($fields) // ->from('AcmeBlogBundle:Post', $alias) // remove this ->where($alias . '.id = :id') ->setParameter('id', 6) ; ... 不同,感谢https://maltronic.io/2014/12/22/doctrine-createquerybuilder-entitymanager-vs-entityrepository/

所以在我的EntityRepository中它应该是

=array_constrain(
  sort(
        query({
          arrayformula(Sheet1!BP6:BU717)
        ,
          FILTER(Sheet1!$BV$6:$DQ$717, Sheet1!$BV$1:$DQ$1=Sheet2!$D$11, Sheet1!$BV$2:$DQ$2=Sheet2!$D$12)
        },"where Col10 <> 0"),
  10,True),
  1,10)

就个人而言,我不喜欢2个不同的函数如何具有相同的名称,但我想这很好,因为一个来自Doctrine,一个来自Symfony。它们是分离的

编辑其实我可能错了,他们都来自学说......叹息

仍然如此,它没有回答为什么在我的原始代码中,它会返回多个时间

答案 1 :(得分:0)

getSingleResult()而不是getResult()怎么样?你应该使用教义方法findOneBy()

答案 2 :(得分:0)

您可以使用存储库提供的帮助程序方法,允许您使用动态方法名称从存储库中获取一个或多个实体,在这种情况下,您希望通过 id获取一个帖子

//fetch one    
$replacementInstruction = $this->getDoctrine()->getRepository("AcmeBlogBundle:Post")->findOneById(6);

有关信息,请使用 - &gt; findBy 属性

获取所有实体