Symfony 4. 摘要存储库中的方法 class 不可用

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

我有一个摘要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
{
.
.
.
}

和 class,扩展了这个摘要 class:

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

在repo中,我定义了方法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!

但是为什么呢?我是否应该为扩展 App\Repository\DocumentRepository?

的 SalesReceiptDocument 实体定义一个回购协议

您的 @Entity 注释没有指定存储库,请将其更改为:

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

See the @Entity documentation.

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

编辑 2:
对于 select 不同的文档类型,您需要单独的存储库,以保持您的代码简单且不重复,如果您要扩展它或拥有自己的私有,则可以使用 EntityRepository$_entityName 属性指示存储库实体名称的属性,然后在 getReviewListPaginator 中使用此实体名称来动态查询所需的实体类型。
据我所知,如果没有为每种类型的文档创建单独的存储库,您将无法实现这一点——即使每个存储库都是空的,只需扩展基本存储库并按照我的描述进行参数化查询构建。

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

我认为你需要做一个 SalesReceiptReporsitory 明确扩展你的 DocumentRepository 并将 repositoryClass 选项添加到 SalesReceiptDocument 上的 @Entity