使用Doctrine 2的QueryBuilder创建复杂的查询

时间:2018-03-14 22:59:14

标签: php mysql doctrine-orm query-builder

我正在尝试使用MySQL数据库和Doctrine 2作为ORM在PHP 7中编写自己的登录脚本。不幸的是,当我尝试从数据库中获取数据时(例如,用户通过登录名登录帐户),我得到Doctrine\ORM\Query\QueryException

我遵循代码第一种方法,并将我的实体用于用户帐户,如下所示,以及Doctrine 2实体管理器。有什么我想念的吗?使用简单的->findall()获取数据可以正常工作。

我试图构建的查询:

$query = DatabaseManager::_instance()->createQuery("SELECT a FROM " . LoginAccountDTO::class . " a WHERE a.username = ?1");

或使用查询构建器:

$qb = DatabaseManager::_instance()->createQueryBuilder();
$qb->select('account')
    ->from(LoginAccountDTO::class, 'account')
    ->where('account.username = ?1 OR account.email = ?1')
    ->setParameter(1, $username);

(以及使用教义expr()进行测试)。

创建的DQL如下:

"SELECT a FROM Entities\LoginAccountDTO account WHERE account.username = ?1 or account.email = ?1"

现在,每次尝试->getResult()查询时,都会收到以下错误输出:

  

致命错误:未捕获的Doctrine \ ORM \ Query \ QueryException:在(project-dir)\ vendor \ doctrine \ orm \ lib中选择一个FROM Entities \ LoginAccountDTO a WHERE a.username =?1 \ Doctrine \ ORM \ Query \ QueryException.php:43堆栈跟踪:#0(project-dir)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ Parser.php(487):Doctrine \ ORM \ Query \ QueryException :: dqlError('SELECT account FROM K ...')#1(project-dir)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ Parser.php(987):Doctrine \ ORM \ Query \ Parser-> semanticalError('第0行,第14列......',数组)#2(project-dir)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ Parser.php(1728):Doctrine \ ORM \ Query \ Parser-> validateAbstractSchemaName('Entities \ Accoun')#3(project-dir)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ Parser.php(1578):Doctrine \ ORM \ Query \ Parser-> RangeVariableDeclaration()#4(project-dir)\ ve在第65行的(project-dir)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ QueryException.php

Doctrine的配置应该是正确的,因为如果我尝试通过->findAll()获取数据,我可以看到存储的数据。同样,实体也在数据库中正确创建。

我尝试使用Doctrine 2(.6.0),如文档中所述,但没有成功。可以请任何人帮我从Doctrine的查询字符串/准备好的查询中的where子句从数据库中获取数据吗?

1 个答案:

答案 0 :(得分:0)

我发现,这个问题的解决方案对我来说是安静的:这个问题是由于在使用实体类的类中缺少import语句而引起的。学说只是回应致命错误。

简而言之:始终导入将由班级使用的实体。