2012-03-28 62 views
0

virtualFields var可能是链接表中字段的总和吗?虚拟字段可以基于cakephp中的链接数据吗?

例如,比方说,发票模型,你可以有

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

但显然只是总结属于该发票行?

谢谢。

==使用CakePHP 2.0

+0

感谢您的所有答案。我想现在归结为“我应该吗?”,而不是“我能吗?”。如前所述,这意味着它取决于每个应用程序。 – khany 2012-05-02 13:23:44

回答

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); 
} 
+0

存储计算值有什么问题?国际海事组织,这是一个比每次需要数据时都要做额外查询更好的方法。 – Dave 2012-03-28 15:31:53

+1

存储从其他字段和值中计算出的值会带来计算结果与计算值之间失去同步的风险。如果数据库是从另一个脚本修改而不是Cake应用程序会发生什么?'beforeSave'不会被调用,并且计算的值将会是错误的。如果真的需要存储计算值,那么最好在数据库本身中使用触发器来执行计算。 – nIcO 2012-03-28 21:56:37

+1

似乎高度依赖于您正在计算/添加的应用程序和数据。但是我看到你对某些应用程序的观点。 – Dave 2012-03-28 23:16:46

0

据我知道,做到这一点的最好办法是有一个实际的total场,并对其进行更新随时保存数据(可能有afterSave callback method)。

因此 - 只要保存了一个InvoiceLine,就会运行一些代码,以新的总和更新它的相关联的Invoice

//InvoiceLine model 
public function beforeSave() { 
    //code to update Invoice's "total" field 
} 
0

理论上,是的,如果该链接表是加入的关联关系(belongsTo和hasOne)。

但是,这将是一个可怜的主意,因为如果你决定不包括该表,你会产生一个SQL错误。

你最好有一个单独的函数获取数据或创建一个嵌套SQL查询的虚拟字段。

0

定义在各型号将更有意义,你的虚拟领域。

如果不这样做,你将打破MVC模式。

您可以使用其他相关模型中的该虚拟字段。

如果您不想在所有相关模型中使用它们,则可以在定义关系时始终使用字段 属性。

public $hasMany = array(
    'IwantVirtualField' => array(
     'className' => 'MyModel', 
     ... 
    ) 
); 

在一种模式,你不希望虚拟现场 公共$属于关联=阵列( 'IwantVirtualField'=>阵列( '的className'=> 'MyModel1', '域'=>阵列('MyModel1.id','MyModel1.name') ... ) );

相关问题