【问题标题】:Method not found in entity Paginator from doctrine bundle在教义包的实体 Paginator 中找不到方法
【发布时间】:2020-01-18 09:24:18
【问题描述】:

我正在尝试清理一些杂乱无章的代码,但现在我遇到了教义分页器的问题。 当我访问处理分页器的页面以显示我博客的所有不同文章时,我收到此错误:

属性“id”和方法“id()”、“getid()”/“isid()”/“hasid()”或“__call()”都不存在并且在类中具有公共访问权限"Doctrine\ORM\Tools\Pagination\Paginator"。

在原则供应商捆绑中,这些方法未设置,但我的实体有它们,我知道禁止编辑供应商文件。我遗漏了一些东西,因为我不知道是否应该扩展我的分页器实体并添加那些缺少的方法,还是还有更多工作要做?

我刚开始使用 symfony,我知道我的基础不足以独自理解它。

非常感谢您的时间和关注。

这是我的路由类别的文章控制器:

 /**
     * @Route("/categorie/{id}", name="categorie")
     *
     * @param Request                       $request
     * @param Helper                        $helper
     * @param AuthorizationCheckerInterface $authChecker
     * @param DocumentCategory              $categorie
     * @param TwitterService                $twitterService
     *
     * @return RedirectResponse|Response
     */
    public function categorie(
        Request $request,
        Helper $helper,
        AuthorizationCheckerInterface $authChecker,
        DocumentCategory $categorie,
        TwitterService $twitterService
    ) {
        if (!$authChecker->isGranted('IS_AUTHENTICATED_FULLY')
            && !$authChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
            return $this->redirectToRoute('login');
        }
        $page = (int) ($request->get('page'));
        if (0 === $page) {
            $page = 1;
        }

        $userType = $this->getDoctrine()->getRepository('App:User')
            ->getManagerExpertCollabo($this->getUser());

        $articleAlaUneListe = [];

        $articleIdListe = $helper->getArticleIdAuth($authChecker);

        $articleListe = $this->getDoctrine()
            ->getRepository('App:Document')
            ->getPage(
                self::ITEM_PER_PAGE * ($page - 1),
                self::ITEM_PER_PAGE,
                'document.dateCreated',
                'DESC',
                '(documentCategory.id = \''.$categorie->getId().'\' and '.$helper->baseRequestArticle().')',
                7,
                [],
                $articleIdListe
            );
        [$articlePopulaireListe, $categorieListe, $totalPage] = $this->getPopularArticleList(
            $articleListe,
            $helper,
            $articleIdListe
        );

        $articlesList->getDocuments();
        $feedData = $twitterService->getTwitterFeed();

        return $this->render('article/list.html.twig', [
                'pageClass' => 'backoffice withFooterLarge dashboard',
                'totalPage' => $totalPage,
                'page' => $page,
                'feedData' => $feedData,
                'categorieListe' => $categorieListe,
                'categorie' => $categorie,
                'articleAlaUneListe' => $articleAlaUneListe,
                'articlePopulaireListe' => $articlePopulaireListe,
                'articleListe' => $articleListe, ]);
    }

这是类别字段的文档实体:

 /**
     * @ORM\JoinTable(name="ht_lk_document_category"),
     * @ORM\ManyToMany(targetEntity="App\Entity\DocumentCategory", inversedBy="documents")
     */
    private $categories;

 /**
     * @return Collection|array<DocumentCategory>
     */
    public function getCategories(): Collection
    {
        return $this->categories;
    }

    public function setCategories($category): self
    {
        $this->categories = $category;

        return $this;
    }

这里是 DocumentCategory 实体:

/**
     * @ORM\ManyToMany(targetEntity="App\Entity\Document", mappedBy="categories")
     */
    private $documents;

/**
     * @return Collection|Document[]
     */
    public function getDocuments(): Collection
    {
        return $this->documents;
    }

这里是文档库:

public function getPage($first_result, $max_results, $orderby, $direction, $criteria, $documentType = null, $searchWordArray = [], $articleIdListe = '')
{
    $qb = $this->createQueryBuilder('docArticle');
    $qb->select('docArticle')
    ->addSelect('documentCategory', 'documentCategory')
    ->addSelect('user', 'user')
    /*
    if(sizeof($searchWordArray) > 0){
        $fieldIndice = 1;
        foreach($searchWordArray as $searchWord){
            $qb->andWhere('(document.name_fr LIKE ?'.$fieldIndice.' or document.name_en LIKE ?'.$fieldIndice.' or document.content_fr LIKE ?'.$fieldIndice.' or document.content_en LIKE ?'.$fieldIndice.')');
            $qb->setParameter($fieldIndice++, '%'.$searchWord.'%');
        }
    } */
    ->leftJoin('docArticle.categories', 'documentCategory')
    ->leftJoin('docArticle.author', 'user')
    ->setFirstResult($first_result)
    ->setMaxResults($max_results);
    if (!empty($criteria)) {
        $qb->where('('.$criteria.')');
    }
    if (!empty($orderby)) {
        $qb->orderBy($orderby, $direction);
    }
    $pag = new Paginator($qb->getQuery());
    $qb->setFirstResult(0);
    $qb->setMaxResults(PHP_INT_MAX);
    $sql = $qb->getQuery()->getSql();
    if ('()' !== $articleIdListe) {
        $qb->where('(docArticle.id IN '.$articleIdListe);
    }
    $compte = \count($qb->getQuery()->getScalarResult());

    return ['page' => $pag, 'compte' => $compte];
}

最后是文档类别存储库:

/**
 * @param $first_result
 * @param $max_results
 * @param $orderby
 * @param $direction
 * @param $criteria
 * @param int|null $documentType
 * @param array    $searchWordArray
 * @param string   $articleIdListe
 *
 * @return array
 */
public function getPage(
    $first_result,
    $max_results,
    $orderby,
    $direction,
    $criteria,
    $documentType = null,
    $searchWordArray = [],
    $articleIdListe = ''
) {
    $qb = $this->createQueryBuilder('document');
    $qb->select('document')
    ->addSelect('documentCategory', 'documentCategory')
    ->addSelect('user', 'user')
    ->addSelect('documentType', 'documentType');
    if (\count($searchWordArray) > 0) {
        $fieldIndice = 1;
        foreach ($searchWordArray as $searchWord) {
            $qb->andWhere(
                '('
                .'document.name_fr LIKE ?'.$fieldIndice
                .' or document.name_en LIKE ?'.$fieldIndice
                .' or document.content_fr LIKE ?'.$fieldIndice
                .' or document.content_en LIKE ?'.$fieldIndice
                .')'
            );
            $qb->setParameter($fieldIndice++, '%'.$searchWord.'%');
        }
    }
    if ($documentType) {
        if (\mb_strlen($articleIdListe) > 3) {
            $qb->andWhere('(documentType.id = :documentType OR document.id IN '.$articleIdListe.')')
                ->setParameter('documentType', $documentType);
        } else {
            $qb->andWhere('(documentType.id = :documentType)')
                ->setParameter('documentType', $documentType);
        }
    }
    $qb->leftJoin('document.categories', 'documentCategory')
    ->leftJoin('document.documentType', 'documentType')
    ->leftJoin('document.author', 'user')
    ->setFirstResult($first_result)
    ->setMaxResults($max_results)
    ->andWhere('document.documentType<>6');
    if (!empty($criteria)) {
        $qb->andWhere('('.$criteria.')');
    }
    if (!empty($orderby)) {
        $qb->orderBy($orderby, $direction);
    }
    $sql = $qb->getQuery()->getSql();

    $pag = new Paginator($qb->getQuery());
    dump($pag);
    $qb->setFirstResult(0);
    $qb->setMaxResults(PHP_INT_MAX);
    $sql = $qb->getQuery()->getSql();

    $compte = \count($qb->getQuery()->getScalarResult());

    return ['page' => $pag, 'compte' => $compte];
}

/**
 * @param int|null $documentType
 *
 * @return array
 */
public function getArticleIdList($documentType = null)
{
    $qb = $this->createQueryBuilder('document');
    $qb->select('document.id');
    if ($documentType) {
        $qb->where('(document.documentType = :documentType)')
            ->setParameter('documentType', $documentType);
    }
    $compte = $qb->getQuery()->getScalarResult();

    return $compte;
}

(我删除了这个问题所有不必要的方法)

【问题讨论】:

  • 您的错误通常是 Twig 错误。您应该检查您的模板,看看您是否尝试在 Paginator 实例而不是 Document 实例上获取实体的 id。
  • 但是我正在将参数发送到 twig 所以我的控制器中应该有一个分页器实例吗?
  • 是的,您的存储库方法似乎返回了一个 Paginator 实例。我不能告诉你更多没有看到他们。也许您应该与他们一起编辑您的问题,或者尝试使用这些信息自行查找
  • 我已经更新了代码,我真的不明白如何进入我的实体方法,因为分页器对象覆盖了实体对象。我创建了一个简单的查询,以便从该类别中获取我的文章,这很有效,但是当我添加一些验证字段时,它会向我发送错误

标签: symfony doctrine-orm paginator


【解决方案1】:

将以下代码添加到要从中显示数据的实体类中:

public function getId(): ?string
{
   return $this->id;
}

或者 如果您不希望在视图中显示属性“id”,请注释掉或删除 Twig 模板中相关实体的代码行。比如删除

<td>{{ Category.id }}</td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多