Doctrine CreateQueryBuilder 返回重复结果



在Symfony3中,我正在运行

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

它创建 2 个文件:Post(在实体文件夹中)和PostRepository(在存储库文件夹中扩展DoctrineORMEntityRepository

一切都很好,直到我尝试在我的控制器中运行以下存储库自定义函数

$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)

并没有真正回答我的问题,但显然createQueryBuilder() EntityRepositoryEntityManager是不同的,这要归功于 https://maltronic.io/2014/12/22/doctrine-createquerybuilder-entitymanager-vs-entityrepository/

所以在我的实体存储库中它应该是

...
$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)
;
...

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

编辑 其实我可能是错的,他们都来自教义......叹息

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

getSingleResult() 而不是 getResult() 呢?你也许应该使用教义方法 findOneBy()

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

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

有关信息,获取所有实体是通过 ->findBy属性完成

相关内容

  • 没有找到相关文章

最新更新