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
так далее.).