Symfony 4. Методы из репозитория абстрактного класса недоступны - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть абстрактный класс:

/**
 * @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 голосов
/ 26 февраля 2019

Я не думаю, что репозиторий расширен по умолчанию.

Я думаю, что вам нужно сделать SalesReceiptReporsitory, который явно расширяет ваш DocumentRepository и добавить опции repositoryClass в ваш @Entityна SalesReceiptDocument.

0 голосов
/ 26 февраля 2019

В ваших @Entity аннотациях не указано хранилище, замените их на:

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

См. Документацию @Entity.

Редактировать 1:
Я только что заметил, что у вашего AbstractDocument есть дубликат аннотации @Entity, вы можете просто удалить пустой

Редактировать 2:
Для выбора разных типов документов вам нужны отдельные репозитории,чтобы ваш код был простым и неповторяющимся, вы можете использовать атрибут $_entityName, равный EntityRepository, если вы расширяете его или имеете свой собственный закрытый атрибут, который будет указывать имя объекта для хранилища, а затем использовать это имя объекта вgetReviewListPaginator для динамического запроса нужного вам типа сущности.
Насколько я могу судить, вы не сможете достичь этого, не имея отдельных репозиториев для каждого типа документа - даже если каждый из них пуст, просто расширяя базовый репозиторий и делаяпостроение параметризованного запроса, как я описал.

...