Kaivosukeltaja
Kaivosukeltaja

Reputation: 15735

Can't call custom repository function in Symfony2

We're having problems calling a certain custom entity repository function from our controller in a Symfony2 project. We have successfully done it before with other entities so we're probably missing something and I can't figure out what it could be.

Our repository class looks like this:

<?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;
    }
}

The entity:

<?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
}

When we call the method like this:

$em = $this->getDoctrine()->getEntityManager();
$previousPosts = $em->getRepository('OurSiteOurBundle:Blog')->findPreviousPosts();

We get this:

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

If we do echo get_class($em->getRepository('OurSiteOurBundle:Blog')); it outputs BlogRepository, as expected.

What could be causing the problem? We have a superfluous bundle directory in the project but I'm guessing that can't be causing it?

Upvotes: 1

Views: 5377

Answers (5)

Peniel1127
Peniel1127

Reputation: 73

If use xml for mapping(pass tested): Update xml or yml mapping file, add repository-class attribute:

<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 Then update doctrine cache:

php app/console doctrine:cache:clear-metadata

use yml(not tested):

Acme\DemoBundle\Entity\Post:
  type: entity
  table: posts
  RepositoryClass: Acme\DemoBundle\Entity\PostRepository 

Upvotes: 0

Bonswouar
Bonswouar

Reputation: 1590

I had the same problem. I've seen many posts about that but nothing solved it.

Finally I found out that was because I was previously using generated yml files, so Doctrine didn't read annotations for mapping !

So just be sure you don't have any yml/xml Doctrine files.

And then :

app/console doctrine:cache:clear-metadata

Upvotes: 3

targnation
targnation

Reputation: 927

From the source you provided, this may not be your issue, but it may save others some search time.

I was coming across the same "must start with either findBy or..." error, and it turns out in my Entity definition I had accidentally made a call to the @ORM\Entity annotation Twice. The first time I used it properly and set the repositoryClass, but the second time I just used it by itself (as with an Entity that wouldn't have a custom repository) and so that overwrote the previous repositoryClass definition.

 /**
 *
 * @ORM\Entity(repositoryClass="Company\TestBundle\Entity\MyEntityRepository")
 * @ORM\Table(name="testing_my_entity")
 * @ORM\Entity
 */

class MyEntity
{
etc...
}

Upvotes: 6

Inoryy
Inoryy

Reputation: 8425

If you get this error: The method name must start with either findBy or findOneBy! that means that your custom repository isn't loaded.

Check for typos in the code, clear cache, make sure "OurSiteOurBundle" is the actual shortcut name.

Upvotes: 3

karolhor
karolhor

Reputation: 302

Did you used this entity before? I see strange entity shortcut for Blog

OurSiteOurBundle:Blog

but your Blog have OurSite\ Bundle\OurBundle\Entity namespace. I think it should be

OurSiteBundleOurBundle:Blog

and entity manager points you to wrong repository class

Upvotes: 0

Related Questions