symfony - 在实体表单字段中创建查询

标签 symfony doctrine-orm doctrine-query

我需要获取按字母顺序排序的国家/地区列表。由于我已将实体翻译成四种语言(英语、法语、西类牙语和中文),因此我使用了 gedmo doctrine extensions以便管理翻译。问题是当我在实体表单字段类型中获取此列表时:

$form = $builder->add('country', 'entity', 
array('class' => 'GroupCommonBundle:Country',
      'query_builder' => function(EntityRepository $er) {
                  $query = $er->createQueryBuilder('c')->orderBy('c.name');
       }

结果按原始实体定义(英语)排序,而不是当前区域设置(西类牙语或法语),这是我真正需要的。实际上我使用 $this->container->getParameter('locale')

我尝试在查询中强制使用 Hook ,如 here 所解释的那样:

$query->getQuery()->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));

但是据我所知,这仅在查询写为 dql 时才有效:

    $query = $this->getDoctrine()->getManager()->createQuery('
            SELECT c
            FROM GroupCommonBundle:Country c
            ORDER BY c.name ASC');
    $query->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));

提交的实体表单不允许这样做,因为它正在等待 queryBuilder object .

所以,我需要将我的收藏翻译成他当前的语言并以表格形式排序。有人知道如何实现这一点吗?

最佳答案

我也遇到了和你一样的问题。我不知道是否有更好的解决方案来解决这个问题,但它对我有用。解决方案是覆盖实体表单类型。

表单.xml

<service id="acme.form.type.entity" class="Acme\AcmeBundle\Form\Type\EntityType">
    <tag name="form.type" alias="entity" />
    <argument type="service" id="doctrine" />
</service>

EntityType.php

<?php

namespace Acme\AcmeBundle\Form\Type;

use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bridge\Doctrine\Form\Type\DoctrineType;

use Acme\AcmeBundle\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;

class EntityType extends DoctrineType
{
   public function getLoader(ObjectManager $manager, $queryBuilder, $class)
   {
      return new ORMQueryBuilderLoader($queryBuilder, $manager, $class);
   }

   public function getName()
   {
      return 'entity';
   }
}

ORMQueryBuilderLoader.php

namespace Acme\AcmeBundle\Doctrine\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader as BaseORMQueryBuilderLoader;

class ORMQueryBuilderLoader extends BaseORMQueryBuilderLoader
{
    private $queryBuilder;

    public function __construct($queryBuilder, $manager = null, $class = null)
    {
        parent::__construct($queryBuilder, $manager, $class);

        $this->queryBuilder = $queryBuilder($manager->getRepository($class));
    }

    public function getEntities()
    {
        $query = $this->queryBuilder->getQuery();

        $query->setHint(
            \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
            'Gedmo\\Translatable\\Query\\TreeWalker\\TranslationWalker'
        );

        return $query->execute();
    }
}

希望有帮助。

关于symfony - 在实体表单字段中创建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18984113/

相关文章:

php - 用Symfony 2用Elasticsearch填充索引

symfony - 警告:QueryBuilder::setParameter() 缺少参数 2

symfony2 创建查询生成器

带 LIMIT 的 Doctrine 更新查询

mysql - 如何在 MySQL 查询中为 NOT IN 子句指定命名参数值?

doctrine-orm - 从 LazyLoadCollection 获取元素

Symfony4 - 函数 App\Manager\ImageManager::__construct() 的参数太少,传递了 0 个,预期正好有 1 个

symfony - 我如何使用静态方法中的 Doctrine

php - 单元测试 Symfony Messenger

symfony - PHP 7 和 Doctrine Group 使用