我有一个抽象类:
/**
* @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?
答案 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
。