简体   繁体   English

使用SUM的ZF2自定义数据库查询

[英]ZF2 custom db query using SUM

Can someone give me a hint what I am doing wrong? 有人可以提示我我做错了什么吗?

public function getPaymentSumByTypeAndProject($project_id,$type) {
  $type = (int) $type;
  $project_id = (int) $project_id;
  $rowset = $this->tableGateway->select(array('total_amount' => new Expression('SUM(payment.amount)')))->where(array('type' => $type, 'project_id' => $project_id));
  $row = $rowset->toArray();
  if (!$row) {
    throw new \Exception("Busted :/");
  }
  return $rowset;
}

I want to make the same query: 我要进行相同的查询:

SELECT SUM(amount) FROM payment WHERE type='$type' AND project_id ='$project_id';

Edit: I made small progress, i have figured out how to sum whole column 编辑:我取得了很小的进步,我想出了如何汇总整列

public function getPaymentSumByTypeAndProject($project_id, $type) {
    $type = (int) $type;
    $project_id = (int) $project_id;
    $resultSet = $this->tableGateway->select(function (Select $select) {
                $select->columns(array(new \Zend\Db\Sql\Expression('SUM(amount) as amount')))->where('type="0"');
            });
    return $resultSet;

Maybe someone could help me to figure out how to add condition: "WHERE type='$type' AND project_id='$project_id'" ? 也许有人可以帮助我弄清楚如何添加条件:“ WHERE type ='$ type'AND project_id ='$ project_id'”?

I know this is an old question, but I came across it and figured I'd throw in my two cents: 我知道这是一个古老的问题,但是我遇到了这个问题,并想出了两美分:

public function getPaymentSumByTypeAndProject($project_id, $type) {
    // This TableGateway is already setup for the table 'payment'
    // So we can skip the ->from('payment')
    $sql = $this->tableGateway->getSql();

    // We'll follow the regular order of SQL ( SELECT, FROM, WHERE )
    // So the query is easier to understand
    $select = $sql->select()
            // Use an alias as key in the columns array instead of
            // in the expression itself
            ->columns(array('amount' => new \Zend\Db\Sql\Expression('SUM(amount)')))
            // Type casting the variables as integer can take place
            // here ( it even tells us a little about the table structure )
            ->where(array('type' => (int)$type, 'project_id' => (int)$project_id));

    // Use selectWith as a shortcut to get a resultSet for the above select
    return $this->tableGateway->selectWith($select);
}

Also, an adapter can be retrieved from a table gateway like this: 同样,可以从表网关中检索适配器,如下所示:

$adapter = $this->tableGateway->getAdapter();

But you don't really need it anymore when you select using the above mentioned method. 但是,当您使用上述方法进行选择时,您实际上不再需要它。

Ok now this is working, tell me is this how it;s should be done? 好了,现在这行得通了,请告诉我这应该怎么做?

   public function getPaymentSumByTypeAndProject($project_id, $type) {
        $type = (int) $type;
        $project_id = (int) $project_id;
        $adapter = $this->tableGateway->adapter;
        $sql = new Sql($adapter);
        $select = $sql->select();
        $select->from('payment');
        $select->where(array('type'=>$type,'project_id'=>$project_id));
        $select->columns(array(new \Zend\Db\Sql\Expression('SUM(amount) as amount')));
        $selectString = $sql->getSqlStringForSqlObject($select);
        $resultSet = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
        return $resultSet;
    }

use This one 用这个

  $select = $this->getSql()->select()
       ->columns(array('amount' => new \Zend\Db\Sql\Expression('SUM(amount)')))
       ->where("type ='$type'")
       ->where("project_id ='$project_id'");
    $resultSet = $this->selectWith($select);
    $row = $resultSet->current();   
    // echo $select->getSqlString();die; //check query use this line
    if(!$row){
        return False;
    }
    return $row->amount;

try to make like that instead of (int) $type 尝试使像这样而不是(int) $type

 intval($type);

and

  intval($project_id);

and in your sql change your variables to 并在SQL中将变量更改为

   '".$type."' 

AND

  '".$project_id."'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM