Оператор IF в критериях выбора Propel

Я пытаюсь включить оператор IF в свои критерии продвижения. Вот как я строю свои критерии:

$c = is_object($c) ? $c : new Criteria();
$c->addSelectColumn("CONCAT(DAYOFYEAR(" . SomePeer::CREATED_AT . "), ' ', YEAR(" . SomePeer::CREATED_AT . ")) AS period");
$c->addSelectColumn("COUNT(" . SomePeer::ID . ") AS registrations");
$c->addSelectColumn("COUNT(IF(" . SomePeer::JOIN . " > 0 AND " . SomePeer::JOIN . " < 3, 1, NULL)) AS coreg");
$c->addJoin(SomePeer::IDENTIFIER, self::TRACKING_IDENTIFIER);
$c->add(SomePeer::ASSOCIATE_ID, $user->getId());
$c->addJoin(self::USER_ID, SomePeer::ID);
$c->addJoin(SomePeer::ID, SomePeer::USER_ID);
$c->add(SomePeer::CREDENTIAL, 'student');
$c->addJoin(SomePeer::PROFILE_ID, SomePeer::ID);

Однако при проверке полученного SQL я получаю следующее:

SELECT CONCAT(MONTHNAME(some_table.CREATED_AT), ' ', YEAR(some_table.CREATED_AT)) AS period, COUNT(some_table.ID) AS registrations, COUNT(IF(some_table.JOIN > 0 AND some_table.JOIN < 3, 1, NULL)) AS coreg 
FROM `some_table`, `>` `0` `AND` `some_table`, `some_table`, `some_table`, `some_table`, `some_table` 
WHERE some_table.ASSOCIATE_ID=:p1 
AND some_table.CREDENTIAL=:p2 
AND some_table.IDENTIFIER=some_table.TRACKING_IDENTIFIER 
AND some_table.STUDENT_USER_ID=some_table.ID 
AND some_table.ID=some_table.USER_ID 
AND some_table.PROFILE_ID=some_table.ID 
# Params: some_table.ASSOCIATE_ID => 6, some_table.CREDENTIAL => 'credential'"

По сути, как вы можете видеть, часть запроса FROM неверна. Я предполагаю, что Propel ошибочно принял часть оператора IF в COUNT за имена таблиц и включил их в часть FROM запроса. У кого-нибудь есть идеи, как я могу обойти эту проблему, или кто-то даже смог заставить что-то работать?

Спасибо за вашу помощь,

Винсент


person luxerama    schedule 03.09.2010    source источник


Ответы (1)


Похоже, проблема с именем JOIN. Вы используете «присоединиться» в качестве имени поля??? Попробуйте там другое имя.

person DmitryK    schedule 03.09.2010
comment
Извините, имя поля JOIN_XYZ удалено из последней части, чтобы сократить код, не думая о зарезервированных именах. - person luxerama; 03.09.2010
comment
Не уверен, но попробуйте это: $c-›addSelectColumn(COUNT( . SomePeer::ID . ) AS Registrations); $c-›addSelectColumn(SomePeer::ID); $c-›addSelectColumn(COUNT(IF( . SomePeer::JOIN_XYZ . › 0 AND . SomePeer::JOIN_XYZ . ‹ 3, 1, NULL)) AS coreg); $c-›addSelectColumn(SomePeer::JOIN_XYZ); - person DmitryK; 03.09.2010
comment
Последний вариант — попробуйте переключиться на этот синтаксис: $c-›addAsColumn(registrations, COUNT(.SomePeer::ID.)); - person DmitryK; 03.09.2010