18

我选择Symfony2 docs。据说加

/**
 * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
 */

在我的实体文件中运行php app/console doctrine:generate:entities Acme应该创建ProductRepository文件。它没有。我不能再澄清了,它只是不创建该文件,只是重新创建以前存在的那些实体文件。

4

6 回答 6

26

I am having the same issue

But I've found the answer here: http://brentertainment.com/other/docs/book/doctrine/orm.html

If you have already generated your entity class before adding the repositoryClass mapping, you have to create the class on your own. Fortunately, it’s pretty easy. Simply create the class in the Repository directory of your bundle and be sure it extends Doctrine\ORM\EntityRepository. Once you’ve created the class, you can add any method to query your entities.

Simple, we have to do it by hand because we have already run this once

于 2013-02-21T17:59:58.347 回答
8

您可以尝试指定特定的捆绑包:

php app/console doctrine:generate:entities AcmeStoreBundle

请注意,我有完整的捆绑包名称。

即使您doctrine:generate:entities之前跑步,这也会有所帮助。

于 2014-03-12T07:14:12.317 回答
8

如果您使用 orm.yml 文件生成实体,则可以定义 repositoryClass,然后再次生成实体:

Acme\StoreBundle\Entity\Product:
type: entity
table: product
...
repositoryClass: Acme\StoreBundle\Entity\ProductRepository
...

然后运行:

php app/console doctrine:generate:entities AcmeStoreBundle
于 2015-02-02T03:28:49.207 回答
2

超级简单的解决方案:

如果您还没有生成实体:

php app/console doctrine:generate:entity --entity="AppBundle:EntityName" --fields="id:string(255) content:text(100)"

现在将这些注释行修改为您之前生成的实体:

* @ORM\Table(name="TABLENAME")
* @ORM\Entity(repositoryClass="AppBundle\Entity\EntityNameRepository")

现在,只需运行:

php app/console doctrine:generate:entities AppBundle:EntityNameRepository

现在您有了一个实体和存储库。:)

于 2015-09-24T15:39:20.387 回答
1

要摆脱这个问题并生成 repo 类,您可以临时修改以下文件的末尾symfony\vendor\doctrine\doctrine-bundle\Doctrine\Bundle\DoctrineBundle\Command\generateEntitiesDoctrineCommand.php

if ($m->customRepositoryClassName 
   && false !== strpos($m->customRepositoryClassName, $metadata->getNamespace())) {
     $repoGenerator->writeEntityRepositoryClass(
        $m->customRepositoryClassName, $metadata->getPath());
}

使用以下代码:

if (true) { 
   $output->writeln(
     sprintf('  > AND Repository <comment>%s</comment>', $m->name . "Repository")
   );           
   $repoGenerator->writeEntityRepositoryClass(
     $m->name . "Repository", $metadata->getPath());
} 

一些解释:在这段代码中,

  • if 条件用 'if (true)' 简化(如果愿意,最后可以完全抑制)
  • $m->customRepositoryClassName 被替换为 $m->name."Repository"
  • 当生成 repo 文件时,我添加了一些输出以便(在终端窗口中)得到很好的通知。

如果您不使用 ' if(true) ' 条件,并且想自己检查一下,您还可以添加一个带有输出的兼性 else 案例,以便在将来更好地了解情况:

   else {
       $output->writeln(sprintf('  > NO repository generated for this class'));
    }

修改后,您可以像往常一样重新运行命令:

php app/console doctrine:generate:entities AcmeStoreBundle

这是一个临时代码,因为到目前为止问题对我来说还不是很清楚,我唯一看到的是它似乎来自 $m->customRepositoryClassName,它返回一个空字符串。因此,要找到另一个明确的解决方案,一种方法可能是检查元数据对象的方法 customRepositoryClassName ...

于 2014-10-09T00:33:14.610 回答
-3

基于 Astucieux 的回答:

if (true) { 
    $fullRepositoryClassName = $name . "\\Repository\\" . $basename . "Repository";
    $output->writeln(
        sprintf('  > AND Repository <comment>%s</comment>', $fullRepositoryClassName)
    );           
    $repoGenerator->writeEntityRepositoryClass(
        $fullRepositoryClassName, $metadata->getPath());
} 
于 2015-01-12T16:49:10.400 回答