1

使用学说2,我创建了我entities的 inEntities文件夹。

文件夹:

./
    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'

有谁有想法吗?

4

2 回答 2

3

从未尝试过使用纯 php 的教义 2,但这一行看起来像自动加载器配置:

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

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

于 2012-10-23T18:47:11.627 回答
3

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

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

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

现在,我找到了答案。

答案

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

但是,我们也可以简写使用。

,每个entityManmager人都有一个Repository,我们可以通过使用来获得它$em->getRepository()。之后, with 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

于 2012-10-23T19:06:48.410 回答