virtualFields var是否可以是链接表中字段的总和?
例如,在发票模型中,您可以
吗?public $virtualFields = array(
'invoiceNett' => 'SUM(InvoiceLine.nett)'
);
但显然只会对属于该发票的行进行SUM染?
感谢。
==使用CakePHP 2.0
答案 0 :(得分:0)
据我所知,最好的方法是拥有一个实际的total
字段,并在保存数据的任何时候更新它(可能是afterSave callback method)。
所以 - 只要保存InvoiceLine
,就会运行一些代码来更新相关Invoice
的新代码。
//InvoiceLine model
public function beforeSave() {
//code to update Invoice's "total" field
}
答案 1 :(得分:0)
理论上,是的,如果该链接表是一个已连接的关联(belongsTo和hasOne)。
然而,这不是一个好主意,因为如果您决定不包含该表,则会产生SQL错误。
最好让单独的函数获取数据或创建一个嵌套SQL查询的虚拟字段。
答案 2 :(得分:0)
您可以使用afterFind
回调获取总和。这样可以避免存储计算出的值,应尽可能避免使用。
function afterFind($results)
{
foreach($results as &$result)
{
/*
Use something like:
$this->InvoiceLine->find('all', array('fields' => array('SUM(InvoiceLine.nett) as total'),
'conditions' => array('invoice_id' => $result['Invoice']['id'])));
*/
}
unset($result);
}
答案 3 :(得分:0)
在相应型号中定义虚拟字段会更有意义。
如果没有这样做,你将打破MVC模式。
您可以使用其他相关模型中的虚拟字段。
如果您不想在所有相关模型中使用它们,则可以始终使用该字段 定义关系时的属性。
public $hasMany = array(
'IwantVirtualField' => array(
'className' => 'MyModel',
...
)
);
在您不想要虚拟场的模型中 public $ belongsTo = array( 'IwantVirtualField'=>阵列( 'className'=> 'MyModel1', 'fields'=>数组('MyModel1.id','MyModel1.name') ... ) );