Symfony 1.4 для определения критериев объединения требуются одноранговые константы

#php #sql #symfony-1.4 #propel

#php #sql #symfony-1.4 #propel

Вопрос:

Я хочу поделиться с вами кое-чем довольно раздражающим, потому что эта проблема стоила мне много времени, чтобы понять:

Давайте начнем с чего-то довольно простого:

 $c = new Criteria();
$c->add(PersonPeer::ID, 123);
PersonPeer::doSelect($c);

$c = new Criteria();
$c->add("person.ID", 123);
PersonPeer::doSelect($c);
 

Конечно, оба работают, потому что PersonPeer::ID — это просто представление строки «person.ID «.

Теперь выполните объединение:

 $c = new Criteria();
$c->add(PersonPeer::ID, 123);
$c->addJoin(PersonPeer::ID, OrderPeer::PERSON_ID, Criteria::LEFT_JOIN);
$c->add(OrderPeer::AMOUNT, 10);
PersonPeer::doSelect($c);
 

это работает довольно просто… теперь замените некоторые константы:

 $c = new Criteria();
$c->add(PersonPeer::ID, 123);
$c->addJoin("person.ID", OrderPeer::PERSON_ID, Criteria::LEFT_JOIN);
$c->add("order.AMOUNT", 10);
PersonPeer::doSelect($c);
 

… все еще работает.
Но теперь замените все константы:

 $c = new Criteria();
$c->add("person.ID", 123);
$c->addJoin("person.ID", "order.PERSON_ID", Criteria::LEFT_JOIN);
$c->add("order.AMOUNT", 10);
fbPersonPeer::doSelect($c);
 

Неожиданный сюрприз, это вызывает исключение PropelException:

 wrapped: Cannot fetch TableMap for undefined table: order
 

Так почему, черт возьми, это так? Критерии точно такие же, но это не работает!

Решение: кажется, что Symfony не загрузил OrderPeer !? А вот и забавное «Исправление ошибки»:

 OrderPeer::AMOUNT;
$c = new Criteria();
$c->add("person.ID", 123);
$c->addJoin("person.ID", "order.PERSON_ID", Criteria::LEFT_JOIN);
$c->add("order.AMOUNT", 10);
fbPersonPeer::doSelect($c);
 

Просто вызовите что-нибудь из OrderPeer, и теперь это снова работает.

Довольно странно, не так ли? Это не ошибка, это особенность ?! : D

У кого-нибудь есть лучшее решение или объяснение !? Это проблема Symfony 1.4 или Propel?

Комментарии:

1. Вы уверены в своем значении константы?

2. Да, посмотрите на последние два примера. Проблема не в константах. Вместо «OrderPeer::AMOUNT» я мог бы также вызвать «OrderPeer:: doSomething ()», и теперь это работает, потому что одноранговый узел загружен.

3. О, это не проблема, просто ваша реализация автозагрузчика.