Доктрина: перед вызовом getRootAlias ​​() не было задано ни одного псевдонима.

Мой оригинальный запрос:

Select * from user u
inner join company c
on u.company_id = c.id 
where u.id=2

И я сделал это как:

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

        $qb->select('u')
            ->from('TemplateManager\Bundle\DocumentGeneratorBundle\Entity\User u')
            ->innerjoin('u.company')
            ->where('u.id = ' . $id);
        $query = $qb->getQuery();
        $result = $query->getResult();

Я получаю 500 со следующими данными в журнале:

[2016-09-27 12:06:34] request.INFO: Совпадающий маршрут "templatemanager_documentgenerator_api_client_find" (параметры: "_controller": "TemplateManager\Bundle\DocumentGeneratorBundle\Controller\API\ClientController::findAction", "id": ") 2", "_route": "templatemanager_documentgenerator_api_client_find") [] [] 
> [2016-09-27 12:06:34] security.DEBUG: чтение SecurityContext из сеанса [] []> [2016-09-27 12: 06:34] security.DEBUG: перезагрузка пользователя от провайдера. [] [] 
> [2016-09-27 12:06:34] security.DEBUG: Имя пользователя "admin" было перезагружено от провайдера пользователя. [] [] 
> [2016-09-27 12:06:34] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Псевдоним не был установлен перед вызовом getRootAlias ​​()." в строке //myproject//vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php 423 {"исключение": "[объект] (RuntimeException(код: 0): псевдоним не был установлен до вызова getRootAlias ​​(). по адресу //myproject//vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php:423)"} [] 
> [2016-09-27 12:06:34] security.DEBUG: записать SecurityContext в сеанс [] []

2 ответа

Попробуйте добавить псевдоним в $em->createQueryBuilder();

$em->createQueryBuilder('u');

Кстати, подготовьте свой запрос, чтобы избежать внедрения SQL

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

На моем собственном проекте я попробовал это, и это работает хорошо:

$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();

idUser - это еще одна таблица, а не id, у нас были проблемы с миграцией:)

В ->from()нужен второй параметр, поэтому ваш код будет выглядеть так:

      $qb->select('u')
   ->from('TemplateManager\Bundle\DocumentGeneratorBundle\Entity\User', 'u')

И еще лучше, вы можете использовать User::classкак это:

      use TemplateManager\Bundle\DocumentGeneratorBundle\Entity\User;

...

$qb->select('u')
   ->from(User::class, 'u')
Другие вопросы по тегам