在Symfony 3中访问存储库功能

时间:2017-07-26 14:46:28

标签: php doctrine-orm doctrine symfony-3.3

我在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');
    }

我在实体classe

中添加了注释
 * @ORM\Entity(repositoryClass="AppBundle\Repository\PieceRepository")

2 个答案:

答案 0 :(得分:0)

您必须在实体

中设置存储库类
/**
 * @ORM\Entity(repositoryClass="PieceRepository")
 */

然后在你的控制器中:

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

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

symfony docs

答案 1 :(得分:0)

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

use Doctrine\ORM\Mapping as ORM;

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