2010-09-09 5 views
7

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

$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' в том, что предложение не заменено на 'i__0', как его фиксировать?

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

ответ

7

1: почему это псевдоним таблицы 'я' вместо 'р'?

2: почему 'num_a' в том, что предложение не заменено 'i__0', как его фиксировать?

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

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

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

+0

Спасибо за ваш ответ. Я полностью согласен с вами в том, что нет необходимости знать сгенерированный псевдоним. Меня озадачивает то, что, поскольку псевдоним для count (p.product_id) равен i__0, i__0 следует использовать в условии предложения вместо «num_a». – user443281

+1

Я признаю, что это был старый пост, но я наткнулся на него сегодня и хотел указать, что есть случаи, когда это внутреннее сопоставление псевдонимов таблицы мешает - если вы когда-либо используете функцию SQL, такую ​​как Within(), вы можете " t используйте псевдонимы Doctrine внутри параметров функции. –

6

У меня также возникла проблема с настройкой псевдонима. Мне пришлось установить псевдоним, а затем использовать «ORDER BY» с этим псевдонимом. После решения работал для меня:

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

В результате запроса выглядел как»...() AS P_0 ... ORDER BY P_0" . Надеюсь, это поможет кому-то.

1

Это недействительно SQL.

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

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

Смежные вопросы