Поскольку реляционный статический запрос CStatRelation не удовлетворил меня своим функционалом - в часности, такой нужной вещью, как сортировка - я решил написать небольшое расширение.
Рассмотрим, как оно действует в текущей версии:
У нас есть модели Post и Section. Связь между моделями : Post BELONGS_TO Section. У Section есть поле post_count, которое должно хранить количество моделей Post.
Описываем Post :
Код: Выделить всё
public function behaviors(){
return array(
'blog_counter' => array(
'class' => 'application.extentions.countable.ECountableBehavior',
'model' => 'Section',
'modelCounter' => 'post_counter',
'modelFk' => 'section_id',
),
);
}
Если у Post поменяли Section, то после сохранения изменения счетчики обновятся и у старой Section , и у новой.
Если нужно учитывать некоторые правила, модель можно валидировать - для этого нужно добавить свойство (string) scenario, по которому выполнится Post->validate(), например:
Код: Выделить всё
function rules(){
return array(
array('status', 'compare' , 'compareValue' => self::status_published, 'on' => 'section_count_update')
);
}
function behaviors(){
return array(
'blog_counter' => array(
'class' => 'application.extentions.countable.ECountableBehavior',
'model' => 'Section',
'modelCounter' => 'post_counter',
'modelFk' => 'section_id',
'scenario' => 'section_count_update',
),
);
}
- возможность апдейта, который запрашивает в базе общее количество моделей во избежание ошибок, а не инкрементит текущее значение
- работа с многоколоночным первичным ключом
- поддержка привязки как к таблице\модели , так и CActiveRecord