在ZF2上如何使用表达式而不是引用的表名?

时间:2017-07-19 09:08:26

标签: php postgresql zend-framework2

如何在PHP的ZF2上生成这样的查询?

SELECT timestamp FROM generate_series(0,20,5) AS timestamp

我试过了:

$select = $this->select()
    ->columns(array("timestamp"))
    ->from("timestamp" => array("generate_series(0,20,5)"))

生成:

SELECT "timestamp" FROM "generate_series(0,20,5)" AS "timestamp"

但是之后它正在寻找一个名为generate_series(0,20,5)但不存在的表

还有:

$select = $this->select()
    ->columns(array("timestamp"))
    ->from(array("timestamp" => new \Zend\Db\Sql\Expression('generate_series(0,20,5)')))

但它也会产生错误:

SELECT "timestamp"."timestamp" AS "timestamp" FROM "Object" AS "timestamp"

有关如何将表名转换为表达式而不是引用的表名的任何想法吗?

1 个答案:

答案 0 :(得分:1)

仅供参考,请注意ZF2中还有另一个Zend \ Sql \ Predicate \ Expression类。如果你看一下Select :: from(),我认为你不能将任何Expression对象作为表名传递。

因此,快速解决方案是使用子选择。但它有些丑陋;)

$prefixColumns = false;
$select2 = new Select();
$select2->columns(array('*'), $prefixColumns);
$select2->from('generate_series(0,20,5)');

$select = new Select();
$select->columns(array('timestamp')); // or disable prefixed columns like in $select 2
$select->from(array('tblAlias' => $select2));

这应该提供以下查询:

var_dump($select->getSqlString());

SELECT
  tblAlias.timestamp AS timestamp 
FROM (
  SELECT * FROM generate_series(0,20,5)
) AS tblAlias