【问题标题】:Agile toolkit - access calculated fields (expressions) from dsql?敏捷工具包 - 从 dsql 访问计算字段(表达式)?
【发布时间】: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

提前致谢!

【问题讨论】:

标签: sql atk4


【解决方案1】:

我认为这里有答案:https://stackoverflow.com/a/11596300/204819。重要的是代码产生一个查询。作为 sum() 的参数,您可以指定一个也是表达式的字段,它应该可以正常工作。

【讨论】:

  • 感谢 romanish,这行得通。我看到了,但没有意识到它会适用。是否有我可以在 refSQL() 上调用的方法列表? SUM 和 COUNT 似乎有效,但 AVERAGE 或 AVG 无效。我试图通过简单地传递 set($this->refSQL('UsedItem')->sum('subTotal')/$this->refSQL('UsedItem')->count()) 来构造一个平均函数,但它每次只返回 1 - 似乎我可以检索该值但不能对其执行任何数学运算。
  • refSQL 返回模型对象,因此您应该可以在那里使用任何模型类方法。你也可以调用 DSQL 对象 refSQL()->_dsql 并使用它的 expr() 方法等等。
  • 感谢 DarkSide。我想通了,基于此:stackoverflow.com/questions/11596506/… 我仍在试图弄清楚我可以用 refSQL 做什么。我知道它返回一个模型,但我不确定如何对其所有记录执行操作。
  • refSQL 主要用于子查询
  • ref() 和 refSQL 之间的两个区别是 refSQL 不需要模型使用字段表达式而不是模型的实际加载值作为链接条件。参考:case_id=123,参考SQL:case_id=case.id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多