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 に答える