Преброяване и групиране с Propel

В Doctrine мога да направя:

public function getCount() 
{        
        $q = $this->createQuery('q')
            ->select('*')
            ->addSelect('count(q.name) as count')
            ->groupBy('q.name')
            ->orderBy('count DESC');

        return $q->execute();        
}

Как мога да направя същото в Propel в Symfony 1.4?


person Johan Dannenberg    schedule 06.03.2012    source източник


Отговори (3)


проклет! По-лесно е от това!

Ако трябва да преброите редовете с резултати за дадена заявка, трябва да използвате метода за прекратяване count(), основно:

MyTableQuery::create()->count();

Прочетете следния раздел с документация за повече информация: http://www.propelorm.org/documentation/03-basic-crud.html#query_termination_methods

Ако искате да добавите count или nb допълнителна колона към вашата заявка, която представлява SQL агрегатни функции като COUNT или SUM, тогава трябва да използвате метода withColumn():

$query = MyTableQuery::create()
    ->withColumn('COUNT(*)', 'Count')
    ->select(array('Name', 'Count'))
    ->groupByName()
    ->orderByCount()
    ;

$results = $query->find();
person William Durand    schedule 10.03.2012
comment
Мисля, че OP търсеше нещо по-сложно от просто основно преброяване - нещо като SELECT name, COUNT(*) FROM x GROUP BY name (SELECT * във въпроса може да е червена херинга) - person halfer; 10.03.2012
comment
Бъдете честни и прочетете документацията. За вашето запитване просто напишете MyTableQuery::create()->withColumn('COUNT(*)', 'Count')->select(array('Name', 'Count'))->groupByName()->find(). И в двата случая сте на грешен път. Гласът ви против изобщо не е оправдан. - person William Durand; 10.03.2012
comment
Това не е мой въпрос, но все пак това е много по-добър отговор! Бихте ли редактирали оригиналния си отговор? (Учтиво не съм съгласен относно обосновката, тъй като отговорът ви не отговори на въпроса; обаче, ако коригирате отговора си, с радост ще върна гласуването против). - person halfer; 10.03.2012
comment
Отговорих въз основа на заглавието, грешно прочетох кода... Както и да е, редактирано. - person William Durand; 10.03.2012

опитвам :

public function getCount() 
    $c = new Criteria();
    $c->addAsColumn('count', 'count(name)');
    $c->addDescendingOrderByColumn($c->getColumnForAs('count')); 
    $c->addGroupByColumn('name');
    return self::doCount($c);
}

Тук има някои добри откъси от информация за пропел заявки -> http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date

person Manse    schedule 06.03.2012
comment
Трябва да избягвате използването на критерии. - person William Durand; 10.03.2012
comment
@WilliamDURAND интересува ли се да разшириш това? някаква конкретна причина? - person Manse; 10.03.2012
comment
API на ActiveQuery е много по-добър, наистина работи свободно и е препоръчителният API за използване от 1.5. Propel2 ще се съсредоточи върху подхода ActiveQuery, а не върху критерии/критерий. Още съвети в тази публикация в блога: propel.posterous.com/design-your -queries-like-a-boss - person William Durand; 10.03.2012

Нещо като това:

$myRows = MyTableQuery::create()->
    addAsColumn('count', 'COUNT(name)')->
    addGroupByColumn('count')->
    addDescendingOrderByColumn('count')->
    find();

Не съм сигурен за GROUP BY - може да се нуждаете от псевдоним или да укажете отново клаузата COUNT. Опитайте и вижте какво работи чрез експериментиране :)

Наистина трябва да използвате автоматично довършваща IDE, за да се възползвате от Propel (и Doctrine за този въпрос) - вашите заявки ще бъдат много по-лесни за конструиране.

Обичайният ми отговор обикновено би бил като този на @ManseUK, т.е. базиран на класа Criteria - но това ще бъде премахнато, когато се появи Propel 2, така че вероятно е добра идея да подготвите кода си сега.

person halfer    schedule 06.03.2012
comment
Не е необходимо да пишете заявката сами. Само си помислете, че Propel предоставя методи за прекратяване като find() и count() например. Propel има за цел да бъде възможно най-опростен ;) - person William Durand; 10.03.2012
comment
Както е отбелязано в отговора ви, просто count() би било недостатъчно. - person halfer; 10.03.2012