CActiveRecord::saveCounters что делает?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
andry
Сообщения: 224
Зарегистрирован: 2009.11.08, 16:52

CActiveRecord::saveCounters что делает?

Сообщение andry »

извиняюсь, что если не тут пишу, кто знает скажите, что за добавление такое появилось

Код: Выделить всё

Added CActiveRecord::saveCounters() (Qiang) 
http://code.google.com/p/yii/source/detail?r=3174

не смог найти про его описание

какое то сохранение счётчика вроде..

может что то такое например есть модуль/приложение не важно "Новости" где при за ходе посетителя на детальную страницу производится подсчёт, но чтобы каждый раз при каждом заходе не беспокоить БД не сохранять число счётчика, временно происходит сохранение в некий файл, а после по крону или как там в БД(1 раз в сутки например). Может это и есть что я думаю?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение rak »

дык вот же
http://code.google.com/p/yii/source/bro ... Record.php
/**
* Saves one or several counter columns for the current AR object.
* Note that this method differs from {@link updateCounters} in that it only
* saves the current AR object.
* An example usage is as follows:
* <pre>
* $postRecord=Post::model()->findByPk($postID);
* $postRecord->saveCounters(array('view_count'=>1));
* </pre>
* Use negative values if you want to decrease the counters.
* @param array $counters the counters to be updated (column name=>increment value)
* @return boolean whether the saving is successful
* @see updateCounters
* @since 1.1.8
*/
andry
Сообщения: 224
Зарегистрирован: 2009.11.08, 16:52

Re: CActiveRecord::saveCounters что делает?

Сообщение andry »

а точно, спасибо
только вот понять что там пишут. Через гугл тарнслин перевёл, вот что получилось "Сохранение одного или нескольких столбцов счетчик для текущего объекта АР."
тоесть этим запросом можно обновлять поле с увлечением или уменьшением счётчика?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение samdark »

Да, именно. Это чтобы не делать тяжёлые UPDATE, а обновить исключительно то, что нужно.
andry
Сообщения: 224
Зарегистрирован: 2009.11.08, 16:52

Re: CActiveRecord::saveCounters что делает?

Сообщение andry »

ясненько, спасибо
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение SpiLLeR »

А какой смысл было вносить это в ядро? Это можно реализовать и через поведение...
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение samdark »

Поведения тянут за собой большее потребление памяти.
byteasdf
Сообщения: 99
Зарегистрирован: 2010.09.15, 09:01

Re: CActiveRecord::saveCounters что делает?

Сообщение byteasdf »

А почему тогда не внесут в ядро поведение, которое обновляет связанные модели при сохранении? Оно востребованно куда более часто, чем сохранение счетчиков и этот аспект вызывает у пользователей куда больше вопросов.
wade_seo
Сообщения: 13
Зарегистрирован: 2010.08.03, 21:45

Re: CActiveRecord::saveCounters что делает?

Сообщение wade_seo »

Метод saveCounters сохраняет значения, не применяя поведения? Т.е. если у меня подключено поведение timestamp, поле updated_on не обновится?

Видимо эта штука реально много времени может сэкономить, потому что без нее придется делать disableBehaviours, потом сохранять модель, потом опять энейблить.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение slavcodev »

wade_seo, для этого есть метод saveAttributes() который сохраняет только нужные атрибуты, при этом события beforeSave, afterSave события не выполняются.
Жду Yii 3!
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

Re: CActiveRecord::saveCounters что делает?

Сообщение Vasiliy Baukin »

mc-bear, спасибо, я, честно говоря, даже не знал этого и поступал до этого описанным выше способом. Тогда вопросы такие:
1) в чем разница между saveCounters и saveAttributes?
2) разве поведения технически подключаются в событиях beforeSave и afterSave?
оффтоп:
mc-bear ранее помог мне увидеть, что у меня написано в модели behaviours а не behaviors. теперь он же помог мне увидеть, что у меня две учетки на форуме.. надо, наверное, удалить одну.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение slavcodev »

Wade писал(а):1) в чем разница между saveCounters и saveAttributes?
Не в чем, вот поэтому я никак понять не могу зачем нужно было добавлять saveCounters :?

Код: Выделить всё

$job=Test::model()->findByPk(1);
$job->saveCounters(array('count'=>2));
// получаем запрос UPDATE `test` SET `count`=`count`+2 `jobs`.`id`='1' 
$job->saveAttributes(array('count'=>new CDbExpression('`count`+2')));
// получаем запрос UPDATE `test` SET `count`=`count`+2 `jobs`.`id`='1' 
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение slavcodev »

Wade писал(а):2) разве поведения технически подключаются в событиях beforeSave и afterSave?
нет они подключаются в конструкторе AR, но это не тема этого топика!
Жду Yii 3!
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение SpiLLeR »

По мне не однозначная фича и только засоряет ядро. Видимо кого-то очень сильно утомило писать:

Код: Выделить всё

saveAttributes(array('count'=>new CDbExpression('`count`+1')));
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение slavcodev »

Думаю будет лучше если все свои мысли отпишите здесь или хотя бы проголосуете в пользу или нет.
Жду Yii 3!
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

Re: CActiveRecord::saveCounters что делает?

Сообщение Vasiliy Baukin »

По мне - так немного нелогично. Если в saveCounters мы простым присваиванием переменной числового значения инкрементим его. Тогда бы было бы классно если мы могли бы задавать строку в качестве значения типа "+1" (увеличить),"-1"(уменьшить), просто число - выставить его, ноль - обнулить. Тогда метод был бы более читабелен.
Последний раз редактировалось Vasiliy Baukin 2011.04.17, 18:03, всего редактировалось 1 раз.
mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: CActiveRecord::saveCounters что делает?

Сообщение mrix »

Wade писал(а):
SpiLLeR писал(а):По мне не однозначная фича и только засоряет ядро. Видимо кого-то очень сильно утомило писать:

Код: Выделить всё

saveAttributes(array('count'=>new CDbExpression('`count`+1')));
По мне - так немного нелогично. Если в saveCounters мы простым присваиванием переменной числового значения инкрементим его. Тогда бы было бы классно если мы могли бы задавать строку в качестве значения типа "+1" (увеличить),"-1"(уменьшить), просто число - выставить его, ноль - обнулить. Тогда метод был бы более читабелен.
тогда метод был бы менее читабелен
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

Re: CActiveRecord::saveCounters что делает?

Сообщение Vasiliy Baukin »

В тему на code.google.com http://code.google.com/p/yii/source/detail?r=3174 пришло разъяснение от Quang, цитирую:
Comment by project member qiang.xue, Today (78 minutes ago)
First, saveCounters() is easier to use.
Second, saveCounters() will also update the 'count' attribute of the current AR object.
Third, this is in parallel to updateCounters().
Перевожу:
Во-первых, saveCounters() легче использовать.
Во-вторых, saveCounters() обновит значение 'count' атрибута текущего объекта AR
И в третьих, этот метод существует в параллель к updateCounters()

Кто-нибудь может рассказать про updateCounters()?

UPD: метод принимает отрицательные значения, т.е. можно понижать значение. Жаль, нельзя обнулять. Хотя может быть это хорошо для безопасности метода. Итог - Кванг все сделал как надо :)
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CActiveRecord::saveCounters что делает?

Сообщение SpiLLeR »

Я уже отписывался по той ссылке...
Ни один из доводов Qiang'a лично для меня не является поводом внести такой метод в ядро) А под First, saveCounters() is easier to use. Можно сотню методов написать). А вот saveAttributes в этом плане намного гибсе, и увеличивать и уменьшать и обнулять, единственное, что об этом способе не все могу знать.
Предупрежден - значит вооружен.
devKP.ru
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

Re: CActiveRecord::saveCounters что делает?

Сообщение Vasiliy Baukin »

Я думаю ты (Вы?) не понял немного.

Инкрементировать счетчики - частая задача и стоит того, чтобы укоротить код на 15 символов. Я писал про обнуление, и тут вот как раз Кванг советовал использовать saveAttributes()

Т.е. никто не спорит с тем, что saveAttributes() гибче. Просто saveCouters() короче и специфичнее. А спорить что лучше - бессмысленно. Имхо, каждому свое.
Ответить