Автоматически заполнять поля БД (как созданные, так и модифицированные) - PullRequest
0 голосов
/ 02 мая 2011

В CakePHP, если вы добавляете поля created или modified в любую таблицу БД, то при сохранении или обновлении данных она вставляет DATETIME в поля соответственно.

Я хочу добавить к этому.

У меня есть функция в core.php (app / config / core.php), которая называется isCheap() и может вызываться где угодно.Эта функция возвращает значение ИСТИНА или ЛОЖЬ.

Я хочу расширить МОДЕЛЬ, чтобы, если в любой таблице было поле is_cheap TINYINT(1), она автоматически сохранялась в значение isCheap ().

Я посмотрелв файле cake/libs/model/model.php и в функции save () имеется множество ссылок на created, modified, updated.Я почти уверен, что это то, где он делает свое волшебство, но в нем много чего происходит, и я не уверен, как можно расширить его, чтобы добавить свое поведение?

Ответы [ 2 ]

3 голосов
/ 02 мая 2011

Вы не должны изменять ядро.Вместо этого просто добавьте обратный вызов beforeSave к app_model.php в приложении.Все модели наследуются от этого класса.

Это будет выглядеть примерно так:

function beforeSave() {
    if(isset($this->_schema['is_cheap'])) {
        // your update here
    }
    return true;
}
0 голосов
/ 02 мая 2011

cdburgess ответ - это то, что привело меня к моему решению.Для полноты я хочу добавить сюда именно то, что я сделал.

Я создал файл /app/app_model.php с этим содержимым:

class AppModel extends Model 
{
    function beforeSave()
    {
        if(isset($this->_schema['is_cheap'])) {
            $this->data[$this->alias]['is_cheap'] = isCheap() ? 1 : 0;
        }

        return true;
    }
}

Я добавил ? 1 : 0;, потому что я неуверен, что TRUE / FALSE будет автоматически преобразован в целые числа.

Отлично работает, спасибо cdburgess.

...