Почему псевдоним столбца не работает в доктрине?
Мой сценарий выглядит так:
$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.
У меня есть два вопроса:
Почему псевдоним таблицы
'i'
вместо'p'
?Почему
'num_a'
в предложении having не заменено на'i__0'
, как это исправить?
Спасибо за ваше предложение...
3 answers
1: почему псевдоним таблицы "i" вместо "p"?
2: почему "num_a" в том, что предложение не заменено на "я__0", как это исправить?
На оба вопроса дан простой ответ: Doctrine использует собственные псевдонимы для запроса. Вам не нужно знать эти псевдонимы, так как они не повлияют на вас, и вам не нужно будет с ними работать.
Несмотря на то, что Доктрина называет псевдоним i__0
, вы можете получить доступ к атрибуту с помощью своего пользовательского псевдонима, например $yourObject->num_a
будет иметь надлежащее значение, а именно результат count(p.product_id)
.
Просмотр выходных данных вашего запроса является полезной функцией отладки, но полагаться на in внутри вашего приложения бессмысленно, поскольку эти значения используются только для внутренних механизмов Доктрины.
У меня также была проблема с настройкой псевдонима. Мне пришлось установить псевдоним, а затем использовать "ЗАКАЗАТЬ ПО" с этим псевдонимом. Для меня сработало следующее решение:
$myQuery->addSelect('(<my select>) AS my_alias');
$myQuery->orderBy('my_alias');
В результате запрос выглядел как "...() КАК p_0... ЗАКАЗ ПО p_0". Я надеюсь, что это кому-то поможет.
Это было бы недопустимым SQL.
Стандартное состояние SQL, что ВЫБОР будет логически выполнен после having
. Поэтому вам нужно повторить код с псевдонимами в having
.
Хороший совет. Пока вы работаете с SQL, потребляющими базы данных, придерживайтесь как можно ближе к SQL.