Flo*_*ent 14 dql query-builder symfony-forms symfony
我正在尝试创建一个包含收集类型数据的表单,具体取决于所记录的用户.我正在关注Symfony食谱的这一章.
当query_builder选项是一个闭包,我从DQL获取数据时,一切正常.由于需要从代码中的不同位置获取数据,我更愿意在Repository类中定义查询.
这是我的存储库中的函数:
public function findOwnedBy($user) {
$query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId");
$query->setParameters(array("userId"=>$user->getId()));
return $query->getResult();
}
Run Code Online (Sandbox Code Playgroud)
在Controller中调用并返回Article数组时,此函数有效.这是symfony doc的片段:
$formOptions = array(
'class' => 'Acme\DemoBundle\Entity\User',
'multiple' => false,
'expanded' => false,
'property' => 'fullName',
'query_builder' => function(EntityRepository $er) use ($user) {
// build a custom query, or call a method on your repository (even better!)
},
);
Run Code Online (Sandbox Code Playgroud)
当我在query_builder中调用我的Repository函数时,我收到一个错误:Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given我可以理解,因为我的Repository返回一个Entity数组,而不是QueryBuilder.
我不想在表单中复制代码并创建新的QueryBuilder.从存储库中使用查询的最佳做法是什么?我想在存储库中有两个函数,一个返回一个数组,另一个返回QueryBuilder,但是Symfony doc中的注释" 或者在你的存储库中调用一个方法(甚至更好!) "让我觉得有更好的方法案件.
saa*_*rim 28
应该很容易.请执行下列操作:
public function queryOwnedBy($user) {
$query = $this->createQueryBuilder('a')
->from('MyBundle:Article', 'a')
->innerJoin('a.owndBy', 'u')
->where('u.id = :id')
->setParameter('id', $user->getId());
return $query;
}
public function findOwnedBy($user) {
return $this->queryOwnedBy($user)
->getQuery()
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
然后在表单构建器中:
$formOptions = array(
'class' => 'Acme\DemoBundle\Entity\User',
'multiple' => false,
'expanded' => false,
'property' => 'fullName',
'query_builder' => function(EntityRepository $er) use ($user) {
return $er->queryOwnedBy($user);
},
);
Run Code Online (Sandbox Code Playgroud)
编辑
感谢ncatnow和unagi我已经改变了以前的函数来返回querybuilder
小智 8
我刚刚对saamorim的答案进行了一些修改.工作代码将是这样的:
public function queryOwnedBy($user) {
$query = $this->createQueryBuilder("u")
->where('u.id = :id')
->setParameter('id', $user->getId());
return $query;
}
public function findOwnedBy($user) {
return $this->queryOwnedBy($user)
->getQuery()
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28419 次 |
| 最近记录: |