虚拟场可以基于cakephp中的链接数据吗?

时间:2012-03-28 13:45:30

标签: cakephp

virtualFields var是否可以是链接表中字段的总和?

例如,在发票模型中,您可以

吗?
public $virtualFields = array(
    'invoiceNett' => 'SUM(InvoiceLine.nett)'
);

但显然只会对属于该发票的行进行SUM染?

感谢。

==使用CakePHP 2.0

4 个答案:

答案 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')             ...         )     );