symfony2中的自定义存储库类

时间:2011-11-16 03:50:13

标签: php symfony

我是symfony的新手。当我通过命令行创建实体类时,我创建了一个存储库类。但是我无法访问该存储库类中的自定义函数。如何在symfony2中创建自定义存储库类?有人可以从头开始用一些示例代码给我一步一步的解释吗?

以下是我的存储库类

namespace Mypro\symBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * RegisterRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class RegisterRepository extends EntityRepository
{


    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery('SELECT p FROM symBundle:Register p ORDER BY p.name ASC')
            ->getResult();
    }


}

我这样打电话给我的控制器

$em = $this->getDoctrine()->getEntityManager();
          $pro = $em->getRepository('symBundle:Register')
            ->findAllOrderedByName();

我收到以下错误

Undefined method 'findAllOrderedByName'. The method name must start with either findBy or findOneBy!

我的代码中有任何错误吗?创建存储库类有什么错误吗?我是否需要使用任何课程。

6 个答案:

答案 0 :(得分:69)

我想你只是忘了在你的实体中注册这个存储库。 您只需在实体配置文件中添加存储库类。

在src / Mypro / symBundle / Resources / config / doctrine / Register.orm.yml中:

Mypro\symBundle\Entity\Register:
    type: entity
    repositoryClass: Mypro\symBundle\Entity\RegisterRepository

请勿忘记在此更改后清除缓存,以防万一。

如果您正在使用Annotations(而不是yml config),那么请添加以下内容:

/**
 * @ORM\Entity(repositoryClass="Mypro\symBundle\Entity\RegisterRepository")
*/

到您的Entity类注册存储库

答案 1 :(得分:6)

本手册有一个很好的分步指南... http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

  • 首先在注释/ yaml配置中定义存储库类
  • 创建课程
  • 创建功能
  • 然后调用新创建的函数....

答案 2 :(得分:4)

当我陷入混乱的配置时,我也失去了很多时间。我在我的实体中将存储库类配置为注释映射。映射存在,但存储库仍未与实体关联。当我移动注释映射时 @ORM \ Entity(repositoryClass =“Acme \ DemoBundle \ Entity \ UserRepository”),到最后一行,它有效。

 /*
 * User
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UserRepository")
 */
class User
{
...
}`   

答案 3 :(得分:4)

用于映射的xml: 更新文件夹Resource / config / doctrine中的xml映射文件,添加repository-class属性:

<entity name="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContent" table="uv_update_page_content" repository-class="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContentRepository">

http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/mapping-classes-to-orm-and-odm.html 然后更新缓存:

php app/console doctrine:cache:clear-metadata
php app/console cache:clear

答案 4 :(得分:2)

首先,您不需要自定义仓库来执行此操作。您可以在EM getRepository findBy方法中设置order by子句:

//$em - entity manager
//from Doctrine documentation: findBy(criteria(array), order(array), limit, offset)
$result = $em->getRepository('symBundle:Register')->findBy(array(), array('name' => 'ASC'))

答案 5 :(得分:2)

我只需按照原生文档doc查找我选择的注释。例如,我选择了yaml,为Product.orm.yml和Category.orm.yml文件添加了配置,还为实体方法添加了新的php属性:

protected $products;

public function __construct()
{
    $this->products = new ArrayCollection();
}

表示Category.php和

protected $category;

for Product.php

然后运行php app/console doctrine:generate:entities Acme ,成功添加新的getter和setter