您要求的内容刚刚在 3.2.2 中发布。DB 映射器现在带有以下钩子:beforeinsert
, afterinsert
, beforeupdate
, afterupdate
, beforeerase
,aftererase
和onload
.
所以你可以linetotal
像这样实现计算:
class myModel extends \DB\SQL\Mapper {
static function _beforeupdate($self,$pkeys) {
$self->linetotal = $self->item_qty * $self->item_price;
}
function __construct() {
$f3=\Base::instance();
parent::construct($f3->get('DB'),'mytable');
$this->beforeupdate(array(__CLASS__,'_beforeupdate'));
}
}
但由于计算也与 INSERT 语句相关,因此您还需要挂钩beforeinsert
事件。您可以使用相同的函数来挂钩这两个事件:
class myModel extends \DB\SQL\Mapper {
static function _linetotal($self,$pkeys) {
$self->linetotal = $self->item_qty * $self->item_price;
}
function __construct() {
$f3=\Base::instance();
parent::construct($f3->get('DB'),'mytable');
$this->beforeinsert(array(__CLASS__,'_linetotal'));
$this->beforeupdate(array(__CLASS__,'_linetotal'));
}
}
注意:实现linetotal
计算的另一种方法是简单地覆盖映射器set()
方法:
class myModel extends \DB\SQL\Mapper {
function set($key,$val) {
parent::set($key,$val);
if ($key=='item_qty' || $key=='item_price')
$this->linetotal = $this->item_qty * $this->item_price;
}
}
编辑:
我忘记了第三种选择,实际上在您的情况下看起来更合适:virtual fields。在这种情况下,计算留给数据库引擎。例如:
class myModel extends \DB\SQL\Mapper {
function __construct(){
$f3=\Base::instance();
parent::construct($f3->get('DB'),'mytable');
$this->linetotal = 'item_qty * item_price';
}
}
PS:不要忘记linetotal
从数据库中删除该字段。