原则:调用 getRootAlias() 错误之前未设置别名

Vol*_*il3 6 php doctrine symfony doctrine-orm

我原来的查询是:

\n\n
Select * from user u\ninner join company c\non u.company_id = c.id \nwhere u.id=2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我把它做成了:

\n\n
$em = $this->get(\'doctrine\')->getEntityManager();\n        $qb = $em->createQueryBuilder();\n\n        $qb->select(\'u\')\n            ->from(\'TemplateManager\\Bundle\\DocumentGeneratorBundle\\Entity\\User u\')\n            ->innerjoin(\'u.company\')\n            ->where(\'u.id = \' . $id);\n        $query = $qb->getQuery();\n        $result = $query->getResult();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到 500,日志中包含以下详细信息:

\n\n
\n

[2016-09-27 12:06:34] request.INFO:匹配的路由\n“templatemanager_documentgenerator_api_client_find”(参数:\n“_controller”:\n“TemplateManager\\Bundle\\DocumentGeneratorBundle\\Controller\\API\\ ClientController::findAction",\n "id": "2", "_route":\n "templatemanager_documentgenerator_api_client_find") [] []\n \xe2\x80\xa8> [2016-09-27 12:06:34 ] security.DEBUG:从会话 [] []\n \xe2\x80\xa8> 读取 SecurityContext [2016-09-27 12:06:34] security.DEBUG:从用户提供程序重新加载用户。[] []\n \xe2\x80\xa8> [2016-09-27 12:06:34] security.DEBUG:用户名“admin”已从用户提供程序重新加载\n。[] []\n \xe2\x80\xa8> [2016-09-27 12:06:34] request.CRITICAL:未捕获 PHP 异常\n RuntimeException:“在调用 getRootAlias() 之前未设置别名。”\n在 //myproject//vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php\n 第 423 行 {"exception":"[object] (RuntimeException(code: 0): 在调用之前未设置别名\n getRootAlias().at\n //myproject//vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php:423)"}\n []\n \xe2\x80\xa8> [2016-09- 27 12:06:34] security.DEBUG:在会话 [] [] 中写入 SecurityContext

\n
\n

mio*_*rey 0

尝试在 $em->createQueryBuilder(); 上添加别名;

$em->createQueryBuilder('u');
Run Code Online (Sandbox Code Playgroud)

顺便准备一下查询以避免 sql 注入

$qb->select('u')
  ->from('User', 'u')
  ->where('u.id = ?1')
  ->orderBy('u.name', 'ASC')
  ->setParameter(1, 100);
Run Code Online (Sandbox Code Playgroud)

在我自己的项目中我尝试了这个并且效果很好:

$em = $this->get('doctrine')->getEntityManager();

$qb = $em->createQueryBuilder('u');

$qb->select('u')
        ->from('INSIDE\Bundle\AdminBundle\Entity\TAdminUser', 'u')
        ->innerJoin('u.idUser' , 'myalias')
        ->where('u.idAdminUser = 2');

$query = $qb->getQuery();
$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)

idUser 是另一个表,不是 id,我们遇到了迁移问题:)