如何在ZF2中的tableGateway中使用having()

时间:2014-02-06 13:00:27

标签: zend-framework2

如何在ZF2中使用having()子句?

网上几乎没有例子如何准备正确的选择对象。

我的查询如下:

SELECT root_schema_id as `schema_id`
FROM `standard_specific_root_schemas`
WHERE `vehicle_id` IN (".implode(",",$vehiclesIds).")
GROUP BY `schema_id`, rootSubGroup_id HAVING count(*)=".$noOfVehicles

我正试图在ZF2中运行它:

public function getVehicleWithinCommonRootSubgroupInSpecific($vehiclesIds)
{
    $where = new Where();
    $where->in('vehicle_id', $vehiclesIds);

    $having = new Having('count(*) = '.count($vehiclesIds));

    $rowset = $this->tableGateway->select(function (Select $select) use ($where, $having) {
        $select
            ->where($where)
            ->having($having);
    });

    if (!$rowset) {
        throw new \Exception("Could not find schemas for group $groupId");
    }
    return $rowset;
}

当然,ZF2中的那部分还没有完成,因为我想检查它是否正常工作。 我已经尝试过几种方法来提供params来获取方法但是一切都会产生错误。

请帮忙,我很绝望......

1 个答案:

答案 0 :(得分:6)

我无法测试您的查询,但可以尝试重现您需要的查询。

我通过构造调整了必须使用 - > expression()而不是变量。 我还添加了小组声明。

要查看查询,我添加了一个var_dump:

    $where = new \Zend\Db\Sql\Where();
    $where->in('vehicle_id', $vehiclesIds);

    $having = new \Zend\Db\Sql\Having();
    $having->expression('count(*) = ?', count($vehiclesIds));

    $rowset = $this->tableGateway->select(function (\Zend\Db\Sql\Select $select) use ($where, $having) {
        $select
            ->where($where)
            ->group(array('schema_id', 'rootSubGroup_id'))
            ->having($having);

        var_dump( $select->getSqlString() );
    });

如果有帮助,请告诉我。


要绕过评论中提到的错误,您必须执行以下操作:

$sql = $this->tableGateway->getSql();

$select = $sql->select();

$where = new \Zend\Db\Sql\Where();
$where->in('vehicle_id', $vehiclesIds);

$having = new \Zend\Db\Sql\Having();
$having->expression('count(*) = ?', count($vehiclesIds));

$select
    ->where($where)
    ->group(array('schema_id', 'rootSubGroup_id'))
    ->having($having);

$preparedQuery = $sql->prepareStatementForSqlObject($select);

var_dump( $preparedQuery->getSql() );

但是,如果我是对的,tableGateway会为您执行此操作,因此一旦您开始使用select来查询数据库,错误就会消失。

此外,您也可以使用上述内容,只需替换它:

$preparedQuery = $sql->prepareStatementForSqlObject($select);

var_dump( $preparedQuery->getSql() );

使用:

$this->tableGateway->selectWith($select);