1

我对 Zend 很陌生,并且对 Zend Select 抽象有所了解。在尝试创建一个从不同模式连接另一个表的查询时,我遇到了一些问题。

我要生成的 mySql 查询是:

SELECT * FROM `assets`
JOIN `projects`
ON `assets`.project_id = `projects`.id
JOIN `secondSchema`.`users` AS `users`
ON `users`.id = `projects`.user_id
WHERE `projects`.id = ?
AND `users`.id = ?

使用 Zend/Db/Sql/Sql/Select 我可以设置以下选择构建器,但我正在努力在生成的 Sql 语句中设置另一个模式:

$select = $this->_sqlBuilder->select();
    $select->from('assets');
    $select->join(
        'projects',
        'projects.id = assets.project_id'
    );
    $select->join(
        'users',
        'users.id = projects.user_id'
    );
    $select->where->equalTo('assets.project_id', $projectID);
    $select->where->equalTo('users.id', $userId);

我曾尝试使用 \Zend\Db\Sql\TableIdentifier 来设置模式,但适配器中的原始模式随后被替换,看起来没有一种方法可以让两种模式都出现在查询中。

无论如何要使用 Sql/Select 来执行此操作,还是使用 Zend Db 以错误的方式解决此问题?

谢谢您的帮助

4

2 回答 2

1

看起来这实际上是不可能使用 Db\Select 可悲的。但是,您可以直接从适配器创建一些不错的供应商可移植 sql。 http://framework.zend.com/manual/2.1/en/modules/zend.db.adapter.html

谢谢。

于 2013-04-18T16:27:08.060 回答
0

由于 Select 类转义引号的方式,出现此问题。

$select->join("database2.table2", "database2.table2.id = table.id")

呈现为:

SELECT 'table'.*, 'database2.table2'.* FROM 'table' INNER JOIN 'database2.table2' ON 'database2'.'table2'.'id' = 'table'.'id'

请注意围绕“database2.table2”的不一致和不正确的引用。

更新 \Zend\Db\Sql\Select 中的第 596、599、624、625 行以将“quoteIdentifier”方法替换为“quoteIdentifierInFragment”可以正确呈现查询并允许执行跨数据库连接。

我已经向 Zend 提交了一份问题报告,因为我不相信当前的行为是有意的,因此希望它会在未来的构建中得到更新。现在手动更新类已经很容易了(尽管确实有点脏)。

https://github.com/zendframework/zf2/issues/4307

于 2013-04-24T13:31:28.340 回答