Почему псевдоним столбца не работает в доктрине?


Мой сценарий выглядит так:

$query = Doctrine_Query::create ()
  ->select('count(p.product_id) as num_a')              
  ->from ( 'ProductComments p' )
  ->groupBy('p.product_id')
  ->having('num_a =2 ');

И сгенерированный sql выглядит следующим образом:

SELECT COUNT(i.product_id) AS i__0 FROM productcomments i GROUP BY i.product_id HAVING num_a=2

Таким образом, я получаю ошибку при выполнении sql.

У меня есть два вопроса:

  1. Почему псевдоним таблицы 'i' вместо 'p'?

  2. Почему 'num_a' в предложении having не заменено на 'i__0', как это исправить?

Спасибо за ваше предложение...

Author: BoltClock, 2010-09-09

3 answers

1: почему псевдоним таблицы "i" вместо "p"?

2: почему "num_a" в том, что предложение не заменено на "я__0", как это исправить?

На оба вопроса дан простой ответ: Doctrine использует собственные псевдонимы для запроса. Вам не нужно знать эти псевдонимы, так как они не повлияют на вас, и вам не нужно будет с ними работать.

Несмотря на то, что Доктрина называет псевдоним i__0, вы можете получить доступ к атрибуту с помощью своего пользовательского псевдонима, например $yourObject->num_a будет иметь надлежащее значение, а именно результат count(p.product_id).

Просмотр выходных данных вашего запроса является полезной функцией отладки, но полагаться на in внутри вашего приложения бессмысленно, поскольку эти значения используются только для внутренних механизмов Доктрины.

 7
Author: DrColossos, 2012-01-19 01:06:03

У меня также была проблема с настройкой псевдонима. Мне пришлось установить псевдоним, а затем использовать "ЗАКАЗАТЬ ПО" с этим псевдонимом. Для меня сработало следующее решение:

$myQuery->addSelect('(<my select>) AS my_alias');
$myQuery->orderBy('my_alias');

В результате запрос выглядел как "...() КАК p_0... ЗАКАЗ ПО p_0". Я надеюсь, что это кому-то поможет.

 7
Author: Alan Smith, 2013-06-05 11:29:10

Это было бы недопустимым SQL.

Стандартное состояние SQL, что ВЫБОР будет логически выполнен после having. Поэтому вам нужно повторить код с псевдонимами в having.

Хороший совет. Пока вы работаете с SQL, потребляющими базы данных, придерживайтесь как можно ближе к SQL.

 1
Author: przemo_li, 2015-11-26 08:52:15