Doctrine2中的短类名而不是完整的名称空间和路径

时间:2012-10-23 16:54:40

标签: php doctrine-orm

使用 doctrine2 ,我在entities文件夹中创建了Entities

文件夹:

./
    HelloEntity.php
    WorldEntity.php

我在PHP中创建了我的结构并导入它们:

$namespaceYaml = array($connection->getBundle()->getNamespace() => $bundleFolder.'/Entity/ORM/');
$driver = new YamlDriver($namespaceYaml, '.orm.yml');
$path = $bundleFolder.'/Resource/config/doctrine/metadata/orm';
$config = Setup::createYAMLMetadataConfiguration(array($path), true);
$config->setEntityNamespaces(array($connection->getBundle()->getName() => $connection->getBundle()->getNamespace().'\Entity'));
$config->setMetadataDriverImpl($driver);

现在,它正在发挥作用。我可以使用它们。

例如:

$qb = $this->getRepository()->createQueryBuilder('Hello'); //short here but long in from()
$qb->from('MyWeb\Entities\Hello', 'h'); //Hello Entity

现在,MyWeb是我的主要根/名称空间。当我想在我的表中使用教义时,我必须写MyWeb\Entities\Hello。我想做的就是缩短它们。我可以 使用'Hello'

有没有人有任何想法?

2 个答案:

答案 0 :(得分:3)

从未尝试过使用纯php的doctrine2,但这行看起来像autoloader config:

$config->setEntityNamespaces(array($connection->getBundle()->getName() => $connection->getBundle()->getNamespace().'\Entity'));

也许如果您使用目录/命名空间结构,如MyWeb \ 实体 \ Hello,它将按您的意愿工作

答案 1 :(得分:3)

现在,我在StackOverflow上的其他地方找到了答案。这不是同一个问题,但看起来它可以解决这两个问题。

很快,我们必须为表名而不是短名称使用完全限定的名称空间。但是当我们获得存储库时(除了包名称)我们可以使用短名称

参考:Doctrine DQL and Namespaces (relative only?)

现在,我找到了答案。

<强>答案

我之前的解决方案是正确的。我们必须在第一个str使用完全限定的名称空间减去斜杠。

但是,我们也可以简短地使用它。

请参阅,每个entityManmager都有一个Repository,我们可以使用$em->getRepository()来获取它。之后,使用createQueryBuilder('e')(此处注意“ e ”)会自动生成HelloEntity名称,并将其分配给e别名。

所以,我的代码错了,无需输入命名空间:)

<强>结论

而不是:

$qb = $this->getRepository()->createQueryBuilder('Hello'); //short here but long in from()
$qb->from('MyWeb\Entities\Hello', 'h'); //Hello Entity

使用此:

$qb = $this->getRepository()->createQueryBuilder('h'); //h assigned for Hello table and HelloEntity. So no need for from. It will fetch data two times then.

<强>解决

修复和想法来自:Doctrine2 fetch 5 copy of each record