我是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!
我的代码中有任何错误吗?创建存储库类有什么错误吗?我是否需要使用任何课程。
答案 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
答案 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