Cakephp counterCache множественный counterScope - логическая проблема

Проблема:

У меня есть две модели: Дилер, Тестдрайв (Тестдрайв принадлежит Дилеру через дилер_ид). Я хочу показать статистику в реальном времени о дилерах: всего (Testdrive.active = 1), обработано (Testdrive.active = 1 && Testdrive.processed = 1) ...

У меня около 100 дилеров и 10000 тестдрайвов. Sql на основе подсчета занимает около 10 секунд (неэффективно). Теперь у меня есть cronjob, который запускается каждый час, но у меня нет статистики в реальном времени.

Я попробовал что-то вроде этого:

var $belongsTo = array(
    'Dealer' => array(
        'className' => 'Dealer',
        'foreignKey' => 'dealer_id',
        'counterCache' => 'active',
        'counterScope' => array('Testdrive.active' => 1),
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Dealer' => array(
        'className' => 'Dealer',
        'foreignKey' => 'dealer_id',
        'counterCache' => 'processed',
        'counterScope' => array('Testdrive.active' => 1, 'Testdrive.processed' => 1),
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

... но я перезаписал значение assignTo => 'Dealear'.

Могу ли я иметь массив counterCache с массивом counterScope?

 var $belongsTo = array(
    'Dealer' => array(
        'className' => 'Dealer',
        'foreignKey' => 'dealer_id',
        'counterCache' => array('active', 'processed'),
        'counterScope' => array('active' => array('Testdrive.active' => 1), 'processed' => array('Testdrive.active' => 1, 'Testdrive.processed' => 1)),
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
);

1 ответ

Решение

Есть (сейчас) пример этого в документации. Применительно к примеру в вопросе, который будет:

class TestDrive extends AppModel {

    public $belongsTo = array(
        'Dealer' => array(
            'counterCache' => array(
                'active' => array(
                    'TestDrive.active' => 1
                ),
                'processed' => array(
                    'TestDrive.active' => 1, 
                    'TestDrive.processed' => 1
                )
            )
        )
    );
}

Обратите внимание, что нет необходимости определять ключи со значениями по умолчанию (className, foreignKey так далее.).

Другие вопросы по тегам