Man*_*anu 8 doctrine-query symfony doctrine-orm
我需要获取国家/地区列表,按字母顺序排序.由于我将实体翻译成四种语言(英语,法语,西班牙语和中文),我使用了gedmo学说扩展来管理翻译.问题是当我在实体表单字段类型中获取此列表时:
$form = $builder->add('country', 'entity',
array('class' => 'GroupCommonBundle:Country',
'query_builder' => function(EntityRepository $er) {
$query = $er->createQueryBuilder('c')->orderBy('c.name');
}
Run Code Online (Sandbox Code Playgroud)
结果按原始实体定义(英语)而非当前语言环境(西班牙语或法语)排序,我真正需要的是什么.其实我用的$this->container->getParameter('locale')
我试图迫使查询钩,如解释在这里:
$query->getQuery()->setHint(\Gedmo\Translatable\TranslatableListener::HINT_TRANSLATABLE_LOCALE, $this->container->getParameter('locale'));
Run Code Online (Sandbox Code Playgroud)
但是AFAIK,这只有在查询写成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'));
Run Code Online (Sandbox Code Playgroud)
实体表单不允许这样做,因为它正在等待queryBuilder对象.
所以,我需要翻译我的收藏并以他当前的语言排序.谁知道如何实现这一目标?
我遇到了和你一样的问题.我不知道是否有更好的解决方案来解决问题,但它对我有用.解决方案是覆盖实体表单类型.
forms.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>
Run Code Online (Sandbox Code Playgroud)
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';
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |