0

私はSQLクエリを持っています

    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

見積もりテーブルを無効にするにはどうすればよいですか?

4

2 に答える 2

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 つの引用を選択的に無効にすることは不可能だと思います。少なくとも、ここでローカルに持っている 1.x Zend Framework コードを確認したところ、これは不可能であることがわかりました ;)

于 2013-04-12T05:48:28.287 に答える