Symfony 4.抽象类存储库中的方法不可用

时间:2019-02-26 09:30:43

标签: symfony doctrine-orm doctrine symfony4

我有一个抽象类:

/**
 * @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
{
.
.
.
}

和扩展该抽象类的类:

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

在存储库中,我定义了方法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
        );
    }
}

如果我愿意

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

方法getReviewListPaginator被调用。

但如果我这样做

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

我收到错误消息:

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

但是为什么呢?我是否应该为SalesReceiptDocument实体定义一个仓库,以扩展App \ Repository \ DocumentRepository?

2 个答案:

答案 0 :(得分:2)

您的@Entity批注未指定存储库,请将其更改为:

@Entity(repositoryClass="..namespace..\DocumentRepository")

See the @Entity documentation.

编辑1:
我刚刚注意到您的AbstractDocument具有重复的@Entity批注,您可以删除空的

编辑2:
要选择不同的文档类型,您需要单独的存储库,以使代码简单而不重复,如果要扩展它,则可以使用$_entityName的{​​{1}}属性,或者使用自己的private属性指示存储库的实体名称,然后在EntityRepository中使用该实体名称来动态查询所需的实体类型。
据我所知,如果没有每种类型的文档的独立存储库,就无法实现这一目标-即使每个文档都是空的,仅扩展基础存储库并按照我所述进行参数化查询即可。

答案 1 :(得分:2)

我不认为默认情况下扩展存储库。

我认为您需要做一个SalesReceiptReporsitory来显着超越您的DocumentRepository 并将repositoryClass选项添加到@Entity上的SalesReceiptDocument