Визуализация рассчитанного значения, которого нет в базе данных - PullRequest
2 голосов
/ 29 июня 2010

У меня есть простая таблица с 3 значениями принцип, проценты, период.Я хочу показать эти 3 значения в таблице вместе с подсчитанным простым процентом.Этот интерес только для отображения, не будет храниться в БД.Как я могу достичь этого?Я знаю, что могу использовать Javascript для вычисления процентов и их рендеринга, но могу ли я сделать это через Cakephp?

Ответы [ 6 ]

3 голосов
/ 29 июня 2010

Проверьте эту ссылку: Виртуальные поля

По сути, вы можете определить в своей модели виртуальные поля и использовать их как обычные поля в контроллере и представлении. Вы также можете использовать их в нумерации страниц:)

3 голосов
/ 29 июня 2010

Несколько вещей, которые вы можете сделать. Одним из них является для расчета в базе данных. Это оптимально, если вы можете это сделать (IMO, я предпочитаю выдвигать как можно больше логики данных в БД). Конечно, если вы делаете сложные вычисления и масштабируемость базы данных - это проблема, с которой вы скоро столкнетесь, вы можете облегчить нагрузку на вашу базу данных, поместив это в код.

Вариант 2 - просто рассчитать его перед отображением. В представлении просто напишите код PHP, чтобы рассчитать, что вам нужно. Это может быть довольно странно, в зависимости от того, как часто вам нужно отображать эти (вычисленные) данные.

Вариант 3 - выполнить те же вычисления в модели. Это, наверное, самый Cake-Y способ. Переопределите метод afterFind () вашей модели и просто запустите вычисления для полученных данных. При необходимости добавьте новый индекс массива. Затем всякий раз, когда какой-либо контроллер / представление запрашивает данные из вашей модели, эти данные будут возвращены с вычисленными строками. Скорее всего, так я бы это реализовал.

1 голос
/ 29 июня 2010

Вы можете сделать это в операторе выбора SQL, например:

select Principle, Interest as [interest rate], Period, 
       principle * interest * period / 12 as [Interest Amount] 
    from your_table

Когда он вернется в PHP, он будет выглядеть так же, как если бы вы выбрали таблицу из четырех столбцов вместо трех (т. Е. Вычисленное значение не будет отличаться от других).

0 голосов
/ 07 июля 2010

Расчет по базе данных будет проще с использованием виртуальных полей

смотри это

http://book.cakephp.org/view/1588/virtualFields

0 голосов
/ 05 июля 2010

http://book.cakephp.org/2.0/en/models/callback-methods.html#afterfind

class Account extends AppModel {

    public $name = "Account";

    public function afterFind( $results, $primary = false ){

        parent::afterFind( $results, $primary );
        if( $primary ){
            foreach( $results as $key => $value ){
                if( isset( $value[ $this->alias ] )){
                    // set the a new index for each row returned to the value of Account::__calculateSomething at the correct key
                    $results[ $key ][ $this->alias ][ 'calulated_field_name' ] = $this->__calculateSomething( $results[ $key ][ $this->alias ] );
                }
            }
        }
        return $results;
    }
}

Выполните агрегирование или расчет в функции __calulateSomething ($ data) в модели Account.

Это, конечно, только пример, но он показывает, как использовать параметр $ primary, который передается в обратный вызов afterFind (это означает, что afterFind запускается для вызовов поиска, выполненных непосредственно для этой модели, а не как часть ассоциации .)

Возможно, вам придется проверить формат массива - я здесь этого не делал.

0 голосов
/ 30 июня 2010

В виде:

<?php echo $a * $b / $c ?>

ИЛИ

В контроллере:

$calcVal = $a * $b / $c;
$this->set('calcVal');

, затем в виде:

<?php echo $calcVal ?>

Или любой из перечисленных выше вариантов.

Для простых вещей, где у меня все равно есть значения в представлении, я бы выбрал первое.С другой стороны, для сложных вычислений, использующих значения, которые иначе не использовались бы в представлении, я бы выбрал второе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...