symfony2和doctrine2较短的实体名称

Are*_*tuv 1 symfony doctrine-orm

谁可以摆脱在DQL查询中使用命名空间?我想为我的bundle中的所有doctrine请求分配默认命名空间.在查询构建器中使用默认命名空间也是完美的.我想拥有:

        $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";
Run Code Online (Sandbox Code Playgroud)

代替

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

完整代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

似乎没有办法设置默认的每个包前缀,我必须为所有实体使用那个愚蠢的前缀...超过200个实体...好..让我们设置别名.它通过以下方式完成:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    entity_managers:
        default:
            mappings:
                MyCompanyMySuperPuperBundle:
                    type: annotation
                    alias: xr
    #auto_mapping: true
Run Code Online (Sandbox Code Playgroud)

现在我可以使用xr作为前缀

        $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";
Run Code Online (Sandbox Code Playgroud)

但现在树枝告诉我

在MyCompanyMySuperPuperBundle中呈现模板("未知实体名称空间别名'UMyCompanyMySuperPuperBundle'.")期间抛出异常:默认值:index.html.twig第7行.

我不能使用xr前缀的树枝 - 它不起作用.你有什么想法?

PS:如果我可以在一个代码中使用两个别名MyCompanyMySuperPuperBundle - full和xr - short,那将是完美的...

更新:已解决

有用!现在我可以通过defautl全名和非常短的名称访问模型.twig使用长命名空间名称,所以它的工作原理.

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

K. *_*ert 7

除非您的实体本身根本没有命名空间,否则无法在Doctrine中拥有默认命名空间.但是你可以做的是指定一个更短的命名空间,例如

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

之后,您可以将您的实体称为"e:Issue".您可以将它放入预请求事件侦听器或bundle的boot()方法中.