2013-04-11 50 views
0

我有SQL查询如何禁用报价加入Zend的分贝

select * from table1 
    left join (values (4),(1800),(103500)) AS "filter (id) on table1.id=filter.id 

默认情况下Zend_Db_Select对象表引用。 例如:

$result = '(values (4),(1800),(103500)) AS filter (id)'; 
    $select->joinInner($result, "table1.id = filter.id", ''); 

结果:

SELECT * FROM "table1" 
    INNER JOIN "(values (4),(1800),(103500)) filter (id)" ON table1.id=filter.id 

我需要

SELECT * FROM "table1" 
    INNER JOIN (values (4),(1800),(103500)) filter (id) ON table1.id=filter.id 

如何禁用报价表?

回答

0

这有点棘手。看看下面的代码。

$dbh = Zend_Db_Table::getDefaultAdapter(); 
$select = $dbh->select(); 
$select->from('table1'); 
$select->joinInner(
     array('filter (id)' => new Zend_Db_Expr('(values (4),(1800),(103500))')), 
     "table1.id = filter.id", 
     array() 
); 
echo $select->assemble() . PHP_EOL; 

此代码默认输出下面的语句是不是我们真正想要的,因为标识filter (id)被引用。这是输出。

SELECT `table1`.* FROM `table1` 
INNER JOIN (values (4),(1800),(103500)) AS `filter (id)` ON table1.id = filter.id 

我们需要在配置选项中禁用autoQuoteIdentifiers。例如:

'db' => array(
     'adapter' => 'pdo_mysql', 
     'isDefaultTableAdapter' => true, 
     'params' => array(
      'host' => '<host>', 
      'username' => '<user>', 
      'password' => '<pass>', 
      'dbname' => '<db>', 
      'options' => array(
       'autoQuoteIdentifiers' => false, 
      ), 
     ), 
    ) 

我们得到以下输出

SELECT table1.* FROM table1 
INNER JOIN (values (4),(1800),(103500)) AS filter (id) ON table1.id = filter.id 

注意,在这种情况下,开发商负责在需要时引用的标识符。

我认为这是不可能有选择地关闭引用的表的别名之一。嗯,至少我发现这是不可能的审查时1.x的Zend框架的代码,我在本地这里;)

1

尝试增加$结果到$选择作为Zend_Db_Expr。

+0

我试图做$结果=新Zend_Db_Expr('(值(4),(1800),(103500))作为过滤(ID)')的Zend retern代码SQL'SELECT * FROM “表1” INNER JOIN(值(4),(1800),(103500))过滤器(ID)为 't' ON table1.id = filter.id'这不是你所需要的 – gregman 2013-04-11 10:17:10

+0

是什么?请解释 – 2013-04-11 10:21:12