在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)
答案 0 :(得分:0)
这并没有真正回答我的问题,但显然createQueryBuilder()
EntityRepository
和EntityManager
中的...
$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 属性
获取所有实体