Как выполнять математические операции с полями или выражениями модели в Agile Toolkit

atk4.2.1

У меня есть эта модель:

class Model_Cargo extends Model_Table {
public $table='cargo';
function init(){
    parent::init();

    $this->hasOne('Alumno');
    $this->hasOne('Plan');

    $this->addField('fecha')->type('date');
    $this->addField('fechaCreacion')->type('date');
    $this->addField('fechaVencimiento')->type('date');
    $this->addField('name');
    $this->addField('monto')->type('money');
    $this->addField('cancelado')->type('boolean')->defaultValue(false);

    $this->hasMany('Abono');
    $this->addExpression('abonos')->set($this->refSQL('Abono')->sum('monto'));
   }
}

Я хочу сделать математическую операцию + или - с двумя полями: я действительно хочу подстраховать поле 'monto' с выражением 'abonos', как мне это сделать?

скажем что-то вроде этого:

$this->addExpression('balance')->set('monto'-'abonos');
//this does not work

Я также хотел бы добавить условие, где эти поля равны... могу ли я это сделать?

что-то вроде:

$this->addCondition('monto','abonos');
//this does not work

person mcanedo    schedule 21.07.2012    source источник


Ответы (2)


Я создал пример, иллюстрирующий, как использовать вычисляемые поля в выражениях:

http://agiletoolkit.org/codepad/model/def

Для вашей проблемы вам понадобится что-то вроде этого:

$this->addExpression('balance')->set(function($m,$q){
    return $q->expr('[f1] - [f2]')
        ->setCustom('f1',$m->getElement('monto'))
        ->setCustom('f2',$m->getElement('abonos'));
});
person romaninsh    schedule 23.07.2012

$this->addExpression("balance")->set("monto - abonos"); и все - sql выражение.

тогда ты можешь:

$this->addCondition("balance", ">", 0); или что вам нужно.

person jancha    schedule 22.07.2012
comment
Это не работает, это нормально для поля, но не для выражения, это optput: pdo_error: SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец «abonos» в режиме «список полей»: выберите параметры: Запрос массива ( ): выберите (выберите name из alumno, где cargo.alumno_id = alumno.id) alumno, (выберите name из plan, где cargo.plan_id = plan.id ) plan,fecha,fechaVencimiento,name,monto,cancelado,fechaCreacion, (выберите сумму (monto) из abono, где abono.cargo_id = cargo.id ) abonos,монто - абонос balance,id,fechaCancelacion из cargo - person mcanedo; 22.07.2012
comment
это потому, что абонос - это не столбец, а вычисляемое поле. вы должны поместить полный запрос в поле set(..) для баланса. - person jancha; 23.07.2012