在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()
EntityRepository
和EntityManager
是不同的,这要归功于 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属性完成