这是此问题的后续跟进:Agile toolkit - access calculated fields (expressions) from dsql?。我不确定这是一个错误,还是我错过了什么。
这是我目前的代码:
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('quantity * unitCost')->type('money');
}
class Model_Case extends Model_Table {
public $table='cases';
function init(){
parent::init();
$this->getElement('id')->system(false);
$this->addField('date')->type('date');
$this->hasMany('UsedItem', 'case_id');
$this->addExpression('Total')->set($this->refSQL('UsedItem')->sum('subTotal'))->type('money');
}
这很好用。现在说我想要修改Model_UsedItem
,以便它只选择subTotal < 10
- 简单:$this->addCondition('subTotal','<',10);
的行。现在,如果我将Model_UsedItem
加载到网格中,我会看到只有条件的行。
当我将Model_Case
加载到网格中时,我希望看到Total
列包含sum(subTotal) where subTotal < '10'
。
相反,它会抛出数据库查询失败错误:&#34;没有这样的列subTotal&#34;。 debug()表明它试图这样做:
select `id`,`date`,(select sum(quantity * unitCost) from `usedItems` inner join `Items` as `_I` on `_I`.`id` = `usedItems`.`item_id` where `subTotal` < "10" and `usedItems`.`case_id` = `cases`.`id` ) `Total`
我可以根据实际字段添加条件,所以我很确定这只需要
select `id`,`date`,(select sum(`subTotal`) from (select (quantity * unitCost) `subTotal` from `usedItems` inner join `Items` as `_I` on `_I`.`id` = `usedItems`.`item_id` where `usedItems`.`case_id` = `cases`.`id` and `subTotal` < 10)) `Total`
但我如何说服敏捷工具包呢?
编辑:@DarkSide是正确的,我的代码读了(&#39;数量* unitCost&#39;),我在上面修改过。答案 0 :(得分:0)
它看起来是ATK中的某种错误(或未实现的功能)。
你得到了SQL:
select `id`,`date`,(select sum(quantity * unitCost) from `usedItems` inner join `Items` as `_I` on `_I`.`id` = `usedItems`.`item_id` where `subTotal` < "10" and `usedItems`.`case_id` = `cases`.`id` ) `Total`
但在这种情况下,在WHERE部分中应该是(quantity * unitCost)
而不是subTotal
,如下所示:
select `id`,`date`,(select sum(quantity * unitCost) from `usedItems` inner join `Items` as `_I` on `_I`.`id` = `usedItems`.`item_id` where (quantity * unitCost) < "10" and `usedItems`.`case_id` = `cases`.`id` ) `Total`
我想知道当条件设置时Model_UsedItems
的debug()是什么样的。你能告诉我吗?它有(quantity * unitCost)<10
还是subTotal<10
?
修改强>
我刚刚创建了你的测试用例并用大约3个月的ATK 4.2.5版本和github的当前版本进行了尝试。一切都很好。
完成测试用例(将其命名为a.php
并将其放入/page
文件夹中):
class Model_UsedItem extends Model_Table {
public $table='usedItems';
function init() {
parent::init();
$this->hasOne('Case', 'case_id', 'id');
$i = $this->join('Items', 'item_id');
$i->addField('unitCost');
$this->addField('quantity');
$this->addExpression('subTotal')->set('quantity * unitCost');
$this->addCondition('subTotal','<',10);
}
}
class Model_Case extends Model_Table {
public $table='cases';
function init(){
parent::init();
$this->addField('date');
$this->hasMany('UsedItem', 'case_id');
$this->addExpression('Total')->set($this->refSQL('UsedItem')->sum('subTotal'));
}
}
class page_a extends Page {
function init(){
parent::init();
$m = $this->add('Model_Case')->debug();
$this->add('Grid')->setModel($m);
}
}
制作SQL:
select `date`,(select sum(quantity * unitCost) `subTotal` from `usedItems` inner join `Items` as `_I` on `_I`.`id` = `usedItems`.`item_id` where quantity * unitCost < 10 and `usedItems`.`case_id` = `cases`.`id` ) `Total`,`id` from `cases`
您可以看到它有subTotal
别名,并且在where
部分中不使用别名(使用完整表达式),因为SQL SELECT中的别名只能用于having
或{ {1}}(在select执行并获取结果集之后)不在order by
。