在CakePHP 2.3中动态取消虚拟字段

时间:2013-04-16 13:16:22

标签: php cakephp

我的问题是:当我执行查找全部时,也使用$ virtualFields,但是,我想在使用它们时选择,或者是否可能在某些情况下禁用。

public $virtualFields = array(
    'sum_total_foods' => 'sum(OrderFood.quantity * OrderFood.price)',
    'sum_original_total_foods' => 'sum(OrderFood.quantity * OrderFood.original_price)',
    'sum_tax_amount' => 'sum((OrderFood.quantity * OrderFood.price) * OrderFood.tax)',
    'tax_amount' => '((OrderFood.quantity * OrderFood.original_price) * OrderFood.tax)',
    'total' => '(OrderFood.quantity * OrderFood.original_price)'
);

所以,如果做的话:

$this->find('all');

CakePHP返回 GROUP BY 错误,当然,我知道原因。

那么,如何动态禁用$virtualFields

2 个答案:

答案 0 :(得分:4)

您可以使用“字段”指定要在此查询中使用的字段(白名单)。 或者您可以使用unset():

unset($this->virtualFields['total']);

小心:这也会在同一个请求中稍后从所有find()调用中删除这些字段。 您可能希望将它们存储在tmp属性$ virtualFieldsTmp中,以将它们放回虚拟字段中。

如果在每次查找调用时都不使用虚拟字段,那么动态使用/添加虚拟字段可能会更明智:

public $availableVirtualFields = array(...);

// before your call
$this->virtualFields['x'] = $this->availableVirtualFields['x'];
...
$result = $this->find(...);

例如。

答案 1 :(得分:1)

如果你在你的控制器中使用它,请使用它:

unset($this->YourModel->virtualFields['x']);

您需要通过模型的方法访问它。