【问题标题】:Using Doctrine 2's QueryBuilder to create complex queries使用 Doctrine 2 的 QueryBuilder 创建复杂的查询
【发布时间】:2018-08-23 15:28:29
【问题描述】:

我正在尝试在 PHP 7 中编写我自己的登录脚本,使用 MySQL 数据库和 Doctrine 2 作为 ORM。不幸的是,当我尝试从数据库中获取数据(例如,用户通过登录名登录帐户)时,我得到了一个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: SELECT a FROM Entities\LoginAccountDTO a WHERE a.username = ?1 in (project-dir)\vendor\doctrine\orm\lib \Doctrine\ORM\Query\QueryException.php:43 堆栈跟踪:#0(项目目录)\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('line 0, col 14 ...', Array) #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 in (project-dir)\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php 第 65 行

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

我尝试使用文档中描述的 Doctrine 2(.6.0),但没有成功。谁能帮我在 Doctrine 的查询字符串/准备查询中使用 where 子句从数据库中获取数据?

【问题讨论】:

    标签: php mysql doctrine-orm query-builder


    【解决方案1】:

    我发现,这个问题的解决方案让我很尴尬:这个问题是由于缺少使用实体类的类中的导入语句造成的。教义只会以致命错误作为回应。

    简而言之,解决方案:始终导入类将使用的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2014-02-07
      • 2015-05-12
      相关资源
      最近更新 更多