Мой сценарий выглядит так:
$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'
в том, что предложение не заменено на 'i__0'
, как его исправлять?
Спасибо за ваше предложение …
1: почему псевдоним таблицы «i» вместо «p»?
2: почему «num_a» в том, что предложение не заменено на «i__0», как его фиксировать?
Оба вопроса просто отвечают: Doctrine использует свои собственные псевдонимы для запроса. Вам не нужно знать эти псевдонимы, так как они не будут влиять на вас, и вам не придется работать с ним.
Несмотря на то, что Doctrine называет псевдоним i__0
вы можете получить доступ к атрибуту с вашим пользовательским псевдонимом, например $yourObject->num_a
будет иметь правильное значение, а именно результат count(p.product_id)
.
Чтобы увидеть, что результат вашего запроса является полезной функцией отладки, но полагаться внутри внутри вашего приложения не имеет смысла, поскольку эти значения используются только для внутренних механизмов Doctrine.
У меня также была проблема с настройкой псевдонима. Мне пришлось установить псевдоним, а затем использовать «ORDER BY» с этим псевдонимом. Следующее решение сработало для меня:
$myQuery->addSelect('(<my select>) AS my_alias'); $myQuery->orderBy('my_alias');
В результате запрос выглядел так: «… () AS p_0 … ORDER BY p_0». Надеюсь, это поможет кому-то.
Это недействительно SQL.
Стандартное состояние SQL, которое SELECT будет логически выполнено после его использования . Поэтому вам нужно повторить код с псевдонимом.
Хороший совет. До тех пор, пока вы работаете с SQL-потребляющими БД, как можно ближе придерживайтесь SQL.