谁可以摆脱在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";
而不是
$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();
}
}
更新
似乎没有办法设置每个捆绑包前缀的默认值,我必须为所有实体使用那个愚蠢的前缀...超过200个实体...确定..让设置别名。 它是通过以下方式完成的:
orm:
auto_generate_proxy_classes: %kernel.debug%
entity_managers:
default:
mappings:
MyCompanyMySuperPuperBundle:
type: annotation
alias: xr
#auto_mapping: true
现在我可以使用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";
但现在树枝告诉我
在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");
}
}
答案 0 :(得分:7)
除非您的实体本身根本没有命名空间,否则无法在Doctrine中拥有默认命名空间。但是,你可以做的是指定一个更短的命名空间,类似于
$em = $container->get('doctrine.orm.entity_manager');
$config = $em->getConfiguration();
$config->addEntityNamespace('e', 'MyCompany\\Bundle\\Entity');
之后,您可以将您的实体称为“e:问题”。您可以将它放入预请求事件侦听器或bundle的boot()方法。