我们在Symfony2项目中从控制器调用某个自定义实体存储库函数时遇到问题。我们之前已经成功地与其他实体一起完成了这项工作,因此我们可能会遗漏一些内容,但我无法弄清楚它可能是什么。
我们的存储库类如下所示:
<?php
namespace OurSite\Bundle\OurBundle\Entity;
use Doctrine\ORM\EntityRepository;
class BlogRepository extends EntityRepository
{
public function findPreviousPosts($limit = 6)
{
$q = $this->createQueryBuilder('q')
->where('q.category = :category')
->setMaxResults($limit)
->add('orderBy', 'q.published ASC')
->getQuery();
$res = $q->getResult();
return $res;
}
}
实体:
<?php
namespace OurSite\Bundle\OurBundle\Entity;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;
/**
* OurSite\Bundle\OurBundle\Entity\Blog
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OurSite\Bundle\OurBundle\Entity\BlogRepository")
*/
class Blog {
// Non-relevant stuff here
}
当我们调用这样的方法时:
$em = $this->getDoctrine()->getEntityManager();
$previousPosts = $em->getRepository('OurSiteOurBundle:Blog')->findPreviousPosts();
我们得到了这个:
Undefined method 'findPreviousPosts'. The method name must start with either findBy or findOneBy!
如果我们echo get_class($em->getRepository('OurSiteOurBundle:Blog'));
,则会按预期输出BlogRepository
。
可能导致问题的原因是什么?我们项目中有一个多余的bundle
目录,但我猜不到它会导致它?
答案 0 :(得分:6)
从您提供的来源中,这可能不是您的问题,但可能会为他人节省一些搜索时间。
我遇到了同样的问题“必须从findBy或......开始”错误,结果在我的实体定义中我偶然调用了@ORM \ Entity注释两次。我第一次正确使用它并设置repositoryClass,但第二次我只是单独使用它(就像没有自定义存储库的实体一样),因此覆盖了之前的repositoryClass定义。
/**
*
* @ORM\Entity(repositoryClass="Company\TestBundle\Entity\MyEntityRepository")
* @ORM\Table(name="testing_my_entity")
* @ORM\Entity
*/
class MyEntity
{
etc...
}
答案 1 :(得分:3)
如果收到此错误:The method name must start with either findBy or findOneBy!
表示未加载自定义存储库。
检查代码中的拼写错误,清除缓存,确保“OurSiteOurBundle”是实际的快捷方式名称。
答案 2 :(得分:3)
我遇到了同样的问题。我看过很多关于这个的帖子,但没有解决它。
最后我发现那是因为我之前使用过生成的yml文件,所以Doctrine没有读取映射注释!
因此,请确保您没有任何yml / xml Doctrine文件。
然后:
app/console doctrine:cache:clear-metadata
答案 3 :(得分:0)
你之前使用过这个实体吗?我看到Blog的奇怪的实体快捷方式
OurSiteOurBundle:博客
但您的博客有OurSite \ 捆绑 \ OurBundle \ Entity名称空间。我认为应该是
OurSiteBundleOurBundle:博客
并且实体管理器将您指向错误的存储库类
答案 4 :(得分:0)
如果使用xml进行映射(通过测试): 更新xml或yml映射文件,添加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 然后更新doctrine cache:
php app/console doctrine:cache:clear-metadata
使用yml(未测试):
Acme\DemoBundle\Entity\Post:
type: entity
table: posts
RepositoryClass: Acme\DemoBundle\Entity\PostRepository