【发布时间】:2014-03-25 16:17:25
【问题描述】:
我有一个带有计算字段的模型:
class Model_UsedItem extends Model_Table {
public $table='usedItems';
function init() {
parent::init();
$this->hasOne('Case', 'case_id', 'id');
$this->hasOne('Item', 'item_id', 'description');
$i = $this->join('Items', 'item_id');
$i->addField('unitCost')->hidden(true);
$this->addField('quantity')
$this->addExpression('subTotal')->set('unitCost * quantity')->type('money');
}
(表 usedItems 包含 id、case_id、item_id 和数量。unitCost 的值存储在单独的表中此处不包含)
这是我的Model_Case:
class Model_Case extends Model_MyTable {
public $table='cases';
function init(){
parent::init();
$this->getElement('id')->system(false);
$this->addField('date')->type('date');
$this->hasMany('UsedItem', 'case_id');
}
这工作得很好,我可以使用带有扩展器的 CRUD 来查看每个案例和相关 UsedItem 条目的列表,以及计算的字段 subTotal。
但我还希望 Model_Case 有一个从 SUM(subTotal) 计算的字段 Total。我通过做它让它工作
$this->addExpression('Total')->set(function($model,$select){
return $select->dsql()
->table('usedItems')->join('items','item_id')
->field($select->expr('SUM(quantity*unitCost)'))
->where('case_id',$select->getField('id'));
})->type('money');
当我已经为 subTotal 编写代码时,这样做似乎效率低下。另外,这是在我的应用程序中使用此概念的最简单的情况,而更复杂的情况最终将完全难以辨认(效率较低?我不确定它是如何工作的)。
如何让Model_Case 访问Model_UsedItem 并对其执行另一次计算? DSQL 只作用于表,而不作用于模型,所以在这里不起作用,对吧?
我习惯于在 MS Access 中执行此操作,其中查询可以像表一样相互调用,因此 Query1 可以计算 SELECT SUM(quantity*unitCost) AS subTotal 然后 Query2 可以执行 SELECT SUM(subTotal) FROM Query1
提前致谢!
【问题讨论】:
-
乍一看似乎没有更好的方法可以做到这一点,但也许我错了。