【问题标题】:custom query in entity field type实体字段类型中的自定义查询
【发布时间】:2011-12-10 11:50:02
【问题描述】:

我用这样的实体类型构建了一个表单:

$form = $this->createFormBuilder()
->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('u')
                          ->orderBy('u.name', 'ASC');
                        },)
      )
->getForm();

现在我想修改这个表单,只显示不同的用户。我试试这个:

->add('users', 'entity', array(
                        'class' => 'UserBundle:Users',
                        'query_builder' => function(EntityRepository $er) {
                        return $er->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users ORDER BY u.name ASC')->getResult();
                        },)
                      )

但是 Symfony 给我抛出了一个异常。我的问题是如何在实体字段类型中使用自定义查询?


我不明白你最后一个答案的意思。我的代码如下:

存储库:

public function getDistinctUsers()
{
    return $this->getEntityManager()->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users u ORDER BY u.name DESC')->getResult();
}

控制器:

->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
    'query_builder' => function(EntityRepository $er) {
            return $er->getDistinctUsers();
         },)
      )

树枝:

<form action="{{ path('user') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <input type="submit" />
</form>

它抛出异常:在渲染模板期间抛出异常(“类型为“Doctrine\ORM\QueryBuilder”的预期参数,“给定数组”)...

【问题讨论】:

  • “我不明白你最后一个答案的意思。”完全没有意义。请将该位添加为对相关答案的评论。您还可以使用您正在谈论的答案上的共享链接,并将其链接到您的编辑。

标签: symfony entity dql


【解决方案1】:

最简单的方法是在查询中添加分组依据:

$form = $this->createFormBuilder()
  ->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
    'query_builder' => function(EntityRepository $er) {
      return $er->createQueryBuilder('u')
                ->groupBy('u.id')
                ->orderBy('u.name', 'ASC');
      },)
    )
->getForm();

【讨论】:

    【解决方案2】:

    我认为您不能在这里使用直接的 DQL;您正在使用 QueryBuilder 对象,因此您必须使用 QueryBuilder API 来构建您的查询。

    更多信息在这里:

    http://www.doctrine-project.org/docs/orm/2.0/en/reference/query-builder.html

    编辑

    您也可以按名称分组?

    return $er->createQueryBuilder('u')
        ->groupBy('u.name')
        ->orderBy('u.name');
    

    编辑

    好的...如果您绝对需要使用 DQL,还有另一种方法。您为您的实体创建一个自定义存储库,并在其中使用您的自定义查询定义一个方法。 Symfony 的文档在这里介绍了这个过程:

    http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes

    假设您创建了一个名为findDistinctUsers 的方法。然后只需将表单中的代码更改为:

    return $er->findDistinctUsers();
    

    我还没有检查过这个,但它应该可以工作。希望这会有所帮助:)

    【讨论】:

    • 感谢您的回复。第一个提示完美,第二个提示抛出异常:在渲染模板期间抛出异常(“未定义方法'findDistinctUsers'。方法名称必须以findBy或findOneBy开头!”)
    • 啊...是的。感谢您指出了这一点。我以前遇到过这种情况。我认为那里有一些教义魔法导致了这种情况;如果您将方法更改为getDistinctUsers(),它应该可以正常工作。
    • 嗯,它不起作用。现在我在渲染模板时遇到问题:在渲染模板期间引发了异常(“预期参数类型为“Doctrine\ORM\QueryBuilder”,“给定数组”)。我正在使用标准代码来呈现模板http://symfony.com/doc/current/book/forms.html#rendering-the-form。还有另一种方式。如果我使用choice_list 而不是实体字段类型,那么一切正常。
    • 我猜您正在自定义存储库方法中执行查询。我会说我们应该返回一个查询构建器对象并让表单执行它。
    • 谢谢 - 这是我一直在努力解决的问题。我试着只是调用 $er->findBy() 但你不能。我认为它应该期望结果而不是查询构建器对象更灵活。文档还应该提供更多信息,因为这很难解决。
    【解决方案3】:

    不要在 Repository 方法中使用:

    ->getQuery()
    ->getResult();
    

    一个人:

    ->createQueryBuilder('u')
    ->groupBy('u.name')
    ->orderBy('u.name');
    

    like in 'query_builder' => function (EntityRepository $er) {

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多