2013-05-12 2 views
1

Кому нужно избавляться от использования пространств имен в DQL-запросах? Я хочу назначить пространство имен по умолчанию для всех запросов доктрины из моего пакета. Также будет полезно использовать пространство имен по умолчанию в построителе запросов. Я хотел бы иметь:symfony2 и doctrine2 более короткие имена объектов

 $dql = "select i 
       from MyCompanyMySuperPuperBundle:Issue i 
        inner join MyCompanyMySuperPuperBundle:Tracker t with t.id = i.tracker 
       where t.name in (?1) and i.version = ?2"; 

вместо

 $dql = "select i 
       from Issue i 
        inner join Tracker t with t.id = i.tracker 
       where t.name in (?1) and i.version = ?2"; 

Полный код:

namespace MyCompany\MySuperPuperBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class IssueRepository extends EntityRepository 
{ 
    public function findStoriesByVersion(\MyCompany\MySuperPuperBundle\Entity\Version $version) 
    { 
     $dql = "select i 
       from MyCompanyMySuperPuperBundle:Issue i 
        inner join MyCompanyMySuperPuperBundle:Tracker t with t.id = i.tracker 
       where t.name in (?1) and i.version = ?2"; 

     return $this->getEntityManager() 
        ->createQuery($dql) 
        ->setParameter(1, array('Epic', 'Story', 'Spike', 'Extra')) 
        ->setParameter(2, $version->getId()) 
        ->getResult(); 
    } 
} 

UPDATE:

Похоже, что нет никакого способа настройки по умолчанию для префикса пакета и я должен использовать эти глупые префиксы для всех сущностей ... mo re более 200 объектов ... ok .. позволяет установить псевдоним. это было сделано с помощью:

orm: 
    auto_generate_proxy_classes: %kernel.debug% 
    entity_managers: 
     default: 
      mappings: 
       MyCompanyMySuperPuperBundle: 
        type: annotation 
        alias: xr 
    #auto_mapping: true 

Теперь я могу использовать хг в качестве префикса

 $dql = "select i 
       from xr:Issue i 
        inner join xr:Tracker t with t.id = i.tracker 
       where t.name in (?1) and i.version = ?2"; 

Но теперь прут говорил мне, что

Исключение было брошено во время рендеринга шаблона (» Неизвестное имя пространства имен псевдонима «UMyCompanyMySuperPuperBundle».) В MyCompanyMySuperPuperBundle: по умолчанию: index.html.twig в строке 7.

И я не могу использовать xr префикс для ветки - это не работает. У тебя есть идеи?

PS: Это будет идеально, если я могу использовать оба псевдонима в одном коде MyCompanyMySuperPuperBundle - полный и хт - коротка ...

UPDATE: РЕШЕНО

Это работает! Теперь я могу получить доступ к моделям через полное имя defautl и очень короткое имя. ветка с длинным именем пространства имен, так что она работает.

class MyCompanyMySuperPuperBundle extends Bundle 
{ 
    public function boot() 
    { 
     // implement alias XR for base namespace 
     $em = $this->container->get("doctrine.orm.entity_manager"); 
     $config = $em->getConfiguration(); 
     $config->addEntityNamespace("XR", "MyCompany\\MySuperPuperBundle\\Entity"); 
    } 
} 

ответ

7

Не существует способа иметь пространство имен по умолчанию в Доктрине, если только ваши объекты не имеют пространства имен вообще. Что вы можете сделать, однако, указать более короткие имена, с чем-то вроде

$em = $container->get('doctrine.orm.entity_manager'); 
$config = $em->getConfiguration(); 
$config->addEntityNamespace('e', 'MyCompany\\Bundle\\Entity'); 

После этого, вы можете обратиться к своим лицам, как «е: Issue». Вы можете поместить это в прослушиватель событий предварительного запроса или метод загрузки() вашего пакета.

+0

извините, вы были правы - это работает !!! ;-) благодаря –

Смежные вопросы