refSQL()无法处理基于表达式的条件? (数据库查询错误"没有这样的列")

时间:2014-03-28 17:13:47

标签: atk4

这是此问题的后续跟进: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;),我在上面修改过。

1 个答案:

答案 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