Propel: нужны критерии для следующего запроса SQL - PullRequest
0 голосов
/ 11 июля 2011

После полдня головных болей, пытаясь выяснить двойное ВНУТРЕННЕЕ СОЕДИНЕНИЕ, я наконец понял это правильно:

SELECT product.id as product_id, count(purchase_vaucher.object_id) as purchased 
FROM purchase_vaucher 
INNER JOIN purchase on purchase.id = purchase_vaucher.object_id 
INNER JOIN product on purchase.product_id = product.id 
WHERE purchase.is_paid=1 
GROUP BY product.id 
ORDER BY purchased_amount desc;

О чем это: в основном, три таблицы: product, purchase, purchase_vaucher (да, я знаю, что это «ваучер», но я не придумал схему). В основном, purchase содержит сделанные покупки и обратную ссылку на product. purchase_vaucher содержит информацию о ваучерах и обратную ссылку на purchase. Что мне было нужно из этого запроса: Для всех purchase с is_paid=1 подсчитайте все ваучеры всех покупок с одинаковым идентификатором продукта и сгруппируйте их по идентификатору продукта.

Что мне нужно: приведенный выше запрос переведен как Propel Criteria вызовы API.

Я сразу начинаю работать над этим, но буду рад, если смогу сэкономить время.

Спасибо.

1 Ответ

1 голос
/ 12 июля 2011

Как ни странно, это оказалось очень просто:

$purchased_amount_column = 'purchased_amount';

$c = new Criteria();
self::addSelectColumns($c);
$c->addAsColumn($purchased_amount_column, 'COUNT(' . PurchaseVaucherPeer::OBJECT_ID . ')');
$c->addGroupByColumn(ProductPeer::ID);
$c->addDescendingOrderByColumn($purchased_amount_column);
$c->add(PurchasePeer::IS_PAID, 1, Criteria::EQUAL);
$c->addJoin(PurchasePeer::ID, PurchaseVaucherPeer::OBJECT_ID, Criteria::INNER_JOIN);
$c->addJoin(PurchasePeer::PRODUCT_ID, ProductPeer::ID, Criteria::INNER_JOIN);

У меня были проблемы с пейджером, но мне потребовалось 5 минут, чтобы понять, что способ заставить его считать записи таких неТривиальные критерии были просто так:

$pager->setPeerCountMethod('customCount');
...
// customCount:
return YourPeer::doCount($yourCriteria);

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

...