【问题标题】:Access repository functions in Symfony 3在 Symfony 3 中访问存储库功能
【发布时间】:2017-07-26 14:46:28
【问题描述】:

我在 PieceRepository 中实现了一个函数,但我无法使用它。在控制器中使用时出现此错误:

未定义的方法“FindAllDetailsPieces”。方法名称必须以 findBy 或 findOneBy 开头!

这是我的ProductRepository 文件:

use Doctrine\ORM\EntityRepository;
class PieceRepository  extends EntityRepository  
{
    public function FindAllDetailsPieces($reference)
    {
        $query = $this->getDoctrine()
        ->getManager()
        ->createQuery(
        'SELECT p, c FROM AppBundle:Piece p
        JOIN p.Media m
        JOIN p.Caracteristique c
        JOIN p.Fabricant f
        WHERE p.idPiece = :reference' 

        )->setParameter('reference', $reference);

        try {
           return $query->getResult();
         } catch (\Doctrine\ORM\NoResultException $e) {
          return null;
         }
    }
}  

这是我使用方法的地方:

public function indexAction(Request $request)
{
       $em = $this->getDoctrine()->getManager();
       $piece = new Piece(); //Ligne modifier
       $formRef   = $this->createForm(ReferenceType::class, $piece);

       $formRef->handleRequest($request);
       if ($formRef->isSubmitted() && $formRef->isValid()) {
           $data = $formRef->get('reference')->getData();
           var_dump($data);
           $repository = $em->getRepository('AppBundle:Piece');
           $RechPieces = $repository->FindAllDetailsPieces($data);
           var_dump($RechPieces);
           return $this->render('default/result_ref_search.html.twig', array(
           'RechPieces' => $RechPieces
           ));
          // return $this->redirectToRoute('result_ref_search');
    }

我在实体类中添加注解

 * @ORM\Entity(repositoryClass="AppBundle\Repository\PieceRepository")

【问题讨论】:

  • 显示代码在控制器中的使用方式
  • 你在Entity中加注解了吗?
  • 必须在实体中设置repository类!
  • 您在问题中提到了ProductRepository,但在代码中您粘贴的类名是PieceRepository
  • 是的,我在Entity中添加了注解

标签: php doctrine-orm doctrine symfony-3.3


【解决方案1】:

您可能忘记将映射添加到Product 实体

use Doctrine\ORM\Mapping as ORM;

    /**
     * Product
     *
     * @ORM\Table(name="product")
     * @ORM\Entity(repositoryClass="MyBundle\Repository\ProductRepository")
     */
    class Product
    {
    }

【讨论】:

    【解决方案2】:

    您必须在实体中设置存储库类

    /**
     * @ORM\Entity(repositoryClass="PieceRepository")
     */
    

    然后在你的控制器中:

    $em->getRespository(YourEntity::class)->FindAllDetailsPieces($reference);
    

    如果仍然无法正常工作,也删除元数据缓存(Symfony 中的 ca:cl 命令,或者删除整个缓存目录...)

    symfony docs

    【讨论】:

    • 感谢您的回答,但我不知道我应该如何以及为什么要删除元数据缓存?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多