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
。
我有一个摘要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
。