Search code examples
symfonydoctrine-ormdoctrinesymfony4

Symfony 4. Methods from the repository of the abstract class are not available


I have an abstract class:

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "LegalInsuranceProof" = "LegalInsuranceProofDocument",
 *     "SalesReceipt" = "SalesReceiptDocument"
 * })
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table(name="document_abstract")
 * @ORM\Entity(repositoryClass="App\Repository\DocumentRepository")
 */
abstract class AbstractDocument implements CreateFolderInterface
{
.
.
.
}

and the class, that extends this abstract class:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table(name="document_sales_receipt")
 */
class SalesReceiptDocument extends AbstractDocument
{
.
.
. 
}

In the repo, I have defined the method getReviewListPaginator:

class DocumentRepository extends ServiceEntityRepository {

    use PaginatorTrait;

    public function __construct(RegistryInterface $registry) {
        parent::__construct($registry, AbstractDocument::class);
    }

    public function getReviewListPaginator($limit, $offset) {
        $this->assertQueryParameters($offset, $limit, "asc");

        $qb = $this
            ->createQueryBuilder('d')
            ->select('PARTIAL d.{id, pageCount}')
            ->innerJoin('d.case', 'c')
            ->addSelect('PARTIAL c.{id}')
            ->setFirstResult($offset)
            ->setMaxResults($limit);

        return new Paginator(
            $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY),
            true
        );
    }
}

If I do

$this->em->getRepository(AbstractDocument::class)->getReviewListPaginator(5,2);

the method getReviewListPaginator is called.

But If I do

$paginator = $this->em->getRepository(SalesReceiptDocument::class)->getReviewListPaginator(5,2);

I get en error message:

BadMethodCallException : Undefined method 'getReviewListPaginator'. The method name must start with either findBy, findOneBy or countBy!

But why? Should I define a repo for the SalesReceiptDocument entity, that extends the App\Repository\DocumentRepository?


Solution

  • I don't think the Repository are extended by default.

    I think you need to do a SalesReceiptReporsitory that explicitly exteands your DocumentRepository And add the repositoryClass options to your @Entity on SalesReceiptDocument.