1

我正在尝试创建一个使用以下结构的选择语句:

$db
    ->select()  
    ->from(  
        array('i' => ...),  
        array('provisional', 'itemID', 'orderID'))  
    ->columns(array("'0' AS provisionalQty", "'ballast' AS productType"))  
    ->joinLeft(  
        array('o' => ...),  
        'i.orderID = o.orderID', array())  
    ->joinLeft(  
        array('f' => ...),  
        'i.productID = f.fixtureID AND f.supplierID = o.supplierID', array())  
    ->joinLeft(  
        array('b' => ...),  
        'f.lampTechnology = b.lampTechnology ' .  
        ' AND f.lampCount = b.lampCount ' .  
        ' AND f.ballastVoltage = b.ballastVoltage ' .  
        ' AND b.supplierID = o.supplierID')  
    ->where('i.orderID = ?', $oObj->orderID, Zend_Db::INT_TYPE)  
    ->where('!i.hidden AND i.productType = ? AND !i.provisional', 'fixture')  

MySQL 中的等价物看起来像这样(效果很好)......

SELECT '0' AS provisionalQty, 'ballast' AS productType, i.* FROM ... LEFT JOIN ... WHERE ...;

但是,这并没有按预期工作。$db->columns() 方法期望每个列都有一个表,即使是“伪”列。有任何想法吗?

-克里斯

4

3 回答 3

1

由于这个类的工作方式,似乎使用字符串/数组来查找特定的表,而 Zend_Db_Expr 类不需要实际的表。

$db
    ->select()
    ->columns(new Zend_Db_Expr("'0' AS provisionalQty, 'ballast' AS productType"))
于 2010-02-25T20:21:47.620 回答
0

我认为您在这里错误地使用了列选择。它应该是这样的:

// "ballast AS productType, 0 as provisionalQty"
$db->columns(array("productType" => "ballast", "provisionalQty" => 0));

请记住,列抽象与正常的 AS 语句相反,您不必包含“AS”。

于 2010-02-25T20:10:36.330 回答
0

对于那些正在谷歌搜索并寻找Zend 2Laminas解决方案的人,这是我的代码:

$sql = new Laminas\Db\Sql\Sql($this->adapter);
$select = $sql->select();
$select->from(['i' => ...])
    ->columns([
        'id' => 'id',
        'provisionalQty' => new Laminas\Db\Sql\Predicate\Expression('"0"'),
        'productType' => new Laminas\Db\Sql\Predicate\Expression('"ballast"')
    ]);
于 2021-11-03T13:20:46.903 回答