0
votes

Have some problems with building custom entity repository.

I have the following fatal error while trying method of custom entity repository

Fatal error: Uncaught exception 'BadMethodCallException' with message 'Undefined method 'getByParentId'. The method name must start with either findBy or findOneBy!' in C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\EntityRepository.php:215 Stack trace: #0 C:\Users\user\Desktop\projects\interview\application\controllers\CommentController.php(58): Doctrine\ORM\EntityRepository->__call('getByParentId', Array) #1 C:\Users\user\Desktop\projects\interview\application\controllers\CommentController.php(58): Doctrine\ORM\EntityRepository->getByParentId('1') #2 [internal function]: CommentController->viewCommentsListByParentId('1') #3 C:\Users\user\Desktop\projects\interview\system\core\CodeIgniter.php(359): call_user_func_array(Array, Array) #4 C:\Users\user\Desktop\projects\interview\index.php(203): require_once('C:\Users\user\D...') #5 {main} thrown in C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\EntityRepository.php on line 215

My project structure is models Mappings Repositories Entities Proxies

My doctrine.php has repository loader like this

// load the repositories
$repositoryClassLoader = new \Doctrine\Common\ClassLoader('Repositories', APPPATH.'models');
$repositoryClassLoader->register();

My model class has the following declaration

namespace Entities;

use Doctrine\ORM\Mapping as ORM;

/**
 * Entities\Comment
 * @Entity (repositoryClass="Repositories\CommentRepository")
 */
class Comment
{

My Repository class has the following declaration

namespace Repositories;
use Doctrine\ORM\EntityRepository;
use Entities;

class CommentRepository extends EntityRepository {
    public function getByParentId($parentid) {
        return parent::findBy(array('parentid' => $parentid), array('creationdate' => 'DESC'));
    }
}

Controller code calling for methods of custom repository

   public function viewCommentsListByParentId($parentid) {
        $data = array();
        $data ['comment'] = $this->em->getRepository('Entities\Comment')->getByParentId($parentid);

        $this->load->view('commentsList', $data);
    } 

What I'm doing wrong??? Please, help.


object(Doctrine\ORM\Mapping\ClassMetadata)#34 (32) {
    ["name"]=> string(16) "Entities\Comment"
    ["namespace"]=> string(8) "Entities"
    ["rootEntityName"]=> string(16) "Entities\Comment"
    ["customRepositoryClassName"]=> NULL
    ["isMappedSuperclass"]=> bool(false)
    ["parentClasses"]=> array(0) { }
    ["subClasses"]=> array(0) { }
    ["namedQueries"]=> array(0) { }
    ["identifier"]=> array(1) {
        [0]=> string(2) "id"
    }
    ["inheritanceType"]=> int(1)
    ["generatorType"]=> int(4)
    ["fieldMappings"]=> array(11) {
        ["id"]=> array(4) {
            ["fieldName"]=> string(2) "id"
            ["type"]=> string(7) "integer"
            ["id"]=> bool(true)
            ["columnName"]=> string(2) "id"
        }
        ["parentid"]=> array(4) {
            ["fieldName"]=> string(8) "parentid"
            ["type"]=> string(7) "integer"
            ["columnName"]=> string(8) "parentid"
            ["nullable"]=> bool(false)
        }
        ["isactive"]=> array(4) {
            ["fieldName"]=> string(8) "isactive"
            ["type"]=> string(7) "integer"
            ["columnName"]=> string(8) "isactive"
            ["nullable"]=> bool(false)
        }
        ["isremoved"]=> array(4) {
            ["fieldName"]=> string(9) "isremoved"
            ["type"]=> string(7) "integer"
            ["columnName"]=> string(9) "isremoved"
            ["nullable"]=> bool(false)
        }
        ["removaldate"]=> array(4) {
            ["fieldName"]=> string(11) "removaldate"
            ["type"]=> string(8) "datetime"
            ["columnName"]=> string(11) "removaldate"
            ["nullable"]=> bool(true)
        }
        ["user_name"]=> array(5) {
            ["fieldName"]=> string(9) "user_name"
            ["type"]=> string(6) "string"
            ["columnName"]=> string(9) "user_name"
            ["length"]=> int(255)
            ["nullable"]=> bool(false)
        }
        ["user_email"]=> array(5) {
            ["fieldName"]=> string(10) "user_email"
            ["type"]=> string(6) "string"
            ["columnName"]=> string(10) "user_email"
            ["length"]=> int(255)
            ["nullable"]=> bool(false)
        }
        ["user_avatar"]=> array(5) {
            ["fieldName"]=> string(11) "user_avatar"
            ["type"]=> string(6) "string"
            ["columnName"]=> string(11) "user_avatar"
            ["length"]=> int(255)
            ["nullable"]=> bool(false)
        }
        ["comment"]=> array(4) {
            ["fieldName"]=> string(7) "comment"
            ["type"]=> string(4) "text"
            ["columnName"]=> string(7) "comment"
            ["nullable"]=> bool(false)
        }
        ["creationdate"]=> array(4) {
            ["fieldName"]=> string(12) "creationdate"
            ["type"]=> string(8) "datetime"
            ["columnName"]=> string(12) "creationdate"
            ["nullable"]=> bool(false)
        }
        ["rating"]=> array(4) {
            ["fieldName"]=> string(6) "rating"
            ["type"]=> string(7) "integer"
            ["nullable"]=> bool(false)
            ["columnName"]=> string(6) "rating"
        }
    }
    ["fieldNames"]=> array(11) {
        ["id"]=> string(2) "id"
        ["parentid"]=> string(8) "parentid"
        ["isactive"]=> string(8) "isactive"
        ["isremoved"]=> string(9) "isremoved"
        ["removaldate"]=> string(11) "removaldate"
        ["user_name"]=> string(9) "user_name"
        ["user_email"]=> string(10) "user_email"
        ["user_avatar"]=> string(11) "user_avatar"
        ["comment"]=> string(7) "comment"
        ["creationdate"]=> string(12) "creationdate"
        ["rating"]=> string(6) "rating"
    }
    ["columnNames"]=> array(11) {
        ["id"]=> string(2) "id"
        ["parentid"]=> string(8) "parentid"
        ["isactive"]=> string(8) "isactive"
        ["isremoved"]=> string(9) "isremoved"
        ["removaldate"]=> string(11) "removaldate"
        ["user_name"]=> string(9) "user_name"
        ["user_email"]=> string(10) "user_email"
        ["user_avatar"]=> string(11) "user_avatar"
        ["comment"]=> string(7) "comment"
        ["creationdate"]=> string(12) "creationdate"
        ["rating"]=> string(6) "rating"
    }
    ["discriminatorValue"]=> NULL
    ["discriminatorMap"]=> array(0) { }
    ["discriminatorColumn"]=> NULL
    ["table"]=> array(1) {
        ["name"]=> string(7) "Comment"
    }
    ["lifecycleCallbacks"]=> array(0) { }
    ["associationMappings"]=> array(0) { }
    ["isIdentifierComposite"]=> bool(false)
    ["containsForeignIdentifier"]=> bool(false)
    ["idGenerator"]=> object(Doctrine\ORM\Id\IdentityGenerator)#40 (1) {
        ["_seqName":"Doctrine\ORM\Id\IdentityGenerator":private]=> NULL
    }
    ["sequenceGeneratorDefinition"]=> NULL
    ["tableGeneratorDefinition"]=> NULL
    ["changeTrackingPolicy"]=> int(1)
    ["isVersioned"]=> NULL
    ["versionField"]=> NULL
    ["reflClass"]=> object(ReflectionClass)#41 (1) {
        ["name"]=> string(16) "Entities\Comment"
    }
    ["isReadOnly"]=> bool(false)
    ["reflFields"]=> array(11) {
        ["id"]=> object(ReflectionProperty)#35 (2) {
            ["name"]=> string(2) "id"
            ["class"]=> string(16) "Entities\Comment"
        }
        ["parentid"]=> object(ReflectionProperty)#42 (2) {
            ["name"]=> string(8) "parentid"
            ["class"]=> string(16) "Entities\Comment"
        }
        ["isactive"]=> object(ReflectionProperty)#43 (2) {
            ["name"]=> string(8) "isactive"
            ["class"]=> string(16) "Entities\Comment"
        }
        ["isremoved"]=> object(ReflectionProperty)#44 (2) {
            ["name"]=> string(9) "isremoved" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["removaldate"]=> object(ReflectionProperty)#45 (2) { 
            ["name"]=> string(11) "removaldate" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["user_name"]=> object(ReflectionProperty)#46 (2) { 
            ["name"]=> string(9) "user_name" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["user_email"]=> object(ReflectionProperty)#47 (2) { 
            ["name"]=> string(10) "user_email" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["user_avatar"]=> object(ReflectionProperty)#48 (2) { 
            ["name"]=> string(11) "user_avatar" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["comment"]=> object(ReflectionProperty)#49 (2) { 
            ["name"]=> string(7) "comment" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["creationdate"]=> object(ReflectionProperty)#50 (2) { 
            ["name"]=> string(12) "creationdate" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
        ["rating"]=> object(ReflectionProperty)#51 (2) { 
            ["name"]=> string(6) "rating" 
            ["class"]=> string(16) "Entities\Comment" 
        } 
    } 
    ["_prototype":"Doctrine\ORM\Mapping\ClassMetadataInfo":private]=> NULL 
}
3
Do you have any metadata cache active? If so, purge it. I'm not 100% sure if this is cached, but it is part of the class metadata.Bram Gerritsen
I use apc cache for production. Of course i tried to clear cache. the same resultFactory Girl

3 Answers

6
votes

You have imported Doctrine\ORM\Mapping as ORM.

So you should use @ORM\Entity instead of @Entity in Comment class annotation.

Because for now it does not load annotation ["customRepositoryClassName"]=> NULL

 /**
  * Entities\Comment
  * @ORM\Entity (repositoryClass="Repositories\CommentRepository")
  */
 class Comment
 {
 ..
0
votes

You wrote

/**
 * Entities\Comment
 * @Entity (repositoryClass="Repositories\CommentRepository")
 */
class Comment
{

There's one space between @Entity and the parameters for that annotation: remove it.

0
votes

Despite the OP posting their answer in the comments.

When I attempted to call any of doctrine's clear-cache commands it threw an exception.

$ vendor/bin/doctrine orm:clear-cache:metadata Cannot clear APC Cache from Console, its shared in the Webserver memory and not accessible from the CLI..

My development environment does not use APC so the repository was running fine. When I uploaded it to the production server, it failed with the same error as the OP.

I was able to resolve this issue by executing apc_clear_cache() from a web page. Afterward the custom repository loaded fine.

EG: http://mydoamin.com/clear-cache.php

<?php

apc_clear_cache();

Running it in the CLI will only clear the CLI cache and not the webserver's cache. http://php.net/manual/en/function.apc-clear-cache.php