Symfony 存储库中的查询生成器:错误:Class';AppBundle\Entity\&x27;没有定义

Symfony 存储库中的查询生成器:错误:Class';AppBundle\Entity\&x27;没有定义,symfony,doctrine-orm,dql,symfony-3.4,Symfony,Doctrine Orm,Dql,Symfony 3.4,我尝试通过自定义存储库创建自定义删除逻辑: namespace AppBundle\Repository; use AppBundle\Entity\ContactEmail; class ContactEmailRepository extends \Doctrine\ORM\EntityRepository { /** * Remove an email from the database * @param String $email */ public functi

我尝试通过自定义存储库创建自定义删除逻辑:

namespace AppBundle\Repository;

use AppBundle\Entity\ContactEmail;

class ContactEmailRepository extends \Doctrine\ORM\EntityRepository
{
  /**
  * Remove an email from the database
  * @param String $email
  */
  public function deleteEmail($email)
  {
    $em=$this->getEntityManager();

    $queryBuilder = $em->createQueryBuilder();
    $queryBuilder->delete('AppBundle::ContactEmail','c')
      ->where('c.email=:email')
      ->setParameter('email',$email);

    $query=$queryBuilder->getQuery();

    $p = $query->execute();

    return $p;
  }
}
我通过功能测试来测试它:

namespace Tests\AppBundle\Repository;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use AppBundle\Entity\ContactEmail;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\ORM\Tools\SchemaTool;
Use Doctrine\Common\DataFixtures\Purger\ORMPurger;


use AppBundle\DataFixtures\ContactEmailDataFixture;



class ContactEmailTest extends KernelTestCase
{
/**
    * @var \Doctrine\ORM\EntityManager
    */
   private $entityManager;

   /**
    * {@inheritDoc}
    */
   protected function setUp()
   {
       $kernel = self::bootKernel();

       $this->entityManager = $kernel->getContainer()
           ->get('doctrine')
           ->getManager();

       //In case leftover entries exist
       $schemaTool = new SchemaTool($this->entityManager);
       $metadata = $this->entityManager->getMetadataFactory()->getAllMetadata();

       // Drop and recreate tables for all entities
       $schemaTool->dropSchema($metadata);
       $schemaTool->createSchema($metadata);
   }

   /**
   * Testing whether a preloaded email will get deleted
   */
   public function testDeletion()
   {
     $fixture = new ContactEmailDataFixture();
     $fixture->load($this->entityManager);

     /**
     * @var Appbundle\Repository\ContactEmailRepository
     */
     $repository=$this->entityManager->getRepository(ContactEmail::class);

     $emailToDelete='jdoe@example.com';
     $repository->deleteEmail($emailToDelete);

     $emailSearched=$repository->findOneBy(['email'=>$emailToDelete]);
     $this->assertEmpty($emailSearched);
   }
}
我的实体如下:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * ContactEmail
 *
 * @ORM\Table(name="contact_email")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ContactEmailRepository")
 * @UniqueEntity("email")
 */
class ContactEmail
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
    * @var String
    * @ORM\Column(name="email",type="string",unique=true)
    * @Assert\Email( message = "The email '{{ value }}' is not a valid email.")
    */
    private $email;

    /**
    * @ORM\Column(name="date", type="datetime")
    */
    private $createdAt;

    public function __construct()
    {
      $this->createdAt=new \DateTime("now", new \DateTimeZone("UTC"));
    }

    /**
     * Get id
     *
     * @return int
    */
    public function getId()
    {
        return $this->id;
    }

    /**
    * @param String $email
    * @return ContactEmail
    */
    public function setEmail($email){
      $this->email=$email;

      return $this;
    }

    /**
    * @return String
    */
    public function getEmail(){
      return $this->email;
    }

    public function getCreatedAt()
    {
      return $this->createdAt;
    }
}
我使用以下DataFixture:

namespace AppBundle\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use AppBundle\Entity\ContactEmail;

class ContactEmailDataFixture extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $emails=['jdoe@example.com','example@gmail.com','user1@example.com'];
        foreach($emails as $email){
          $emailEntityInstance=new ContactEmail();
          $emailEntityInstance->setEmail($email);

          $manager->persist($emailEntityInstance);
          $manager->flush();
        }
    }
}
问题是在运行测试时出现以下错误:

Doctrine\ORM\Query\QueryException: [Semantical Error] line 0, col 7 near 'AppBundle::ContactEmail': Error: Class 'AppBundle\Entity\' is not defined.

所以我想知道我在查询语法上犯了什么错误?

在一个扩展了
原则\ORM\EntityRepository
的类中,该类在实体的
@entity
docblock注释的
repositoryClass
属性中引用,您可以得到如下查询生成器:

$queryBuilder = $this->createQueryBuilder('c')
  ->where('c.email=:email')
  ->setParameter('email',$email);

有点奇怪的错误信息。为了好玩,请尝试删除您提到的有效的('ContactEmail::class','c')。也许它需要一个完整的名称空间类名才能工作。实际上,我怀疑删除冒号并使用AppBundle:ContractEmail也可以。正在查找示例,但找不到。AppBundle别名可以追溯到::class功能可用之前,这样可以节省一些输入。现在,只要使用完全限定的名称,一切都应该很好。我认为当你问这个问题时,你的实体被缓存了,但是当你证实Dimitrios Desyllas的建议时,缓存过期了。如果你现在尝试同样的方法,你会经历什么样的行为?在使用新实体进行测试之前,您可能希望清空缓存,请阅读以下内容: