_join内部メソッド(ファイルZend / Db / Select.php )のコードに次の行が存在することにより、すべてがそれほど希望がないというわけではないことが明らかになりました。
773. } else if ($name instanceof Zend_Db_Expr || $name instanceof Zend_Db_Select) {
* This source code was highlighted with Source Code Highlighter .
$ name instanceof Zend_Db_Selectに対して何らかの独自のロジックが設定されていると仮定すると、次のことを試してみてください。
$firstQuery = $db->select()
->from(array( 'u' => 'user' ),
array())
->join(array( 's2u' => 'site2user' ),
's2u.userId = u.id' ,
array( 'siteId' ))
->columns(array( 'userCount' => 'count(*)' ))
->group( 's2u.siteId' );
$secondQuery = $db->select()
->from(array( 's' => 'site' ),
array( 'siteId' => 'id' ,
'site' => 'title' ))
->join(array( 'n' => $firstQuery),
'n.siteId = s.id' ,
array( 'userCount' ));
echo $secondQuery->assemble();
* This source code was highlighted with Source Code Highlighter .
そして、スクリプトの結果、次のようになります。
SELECT `s`.`id` AS `siteId`, `s`.`title` AS `site`, `n`.`userCount` FROM `site` AS `s`
INNER JOIN ( SELECT `su`.`siteId`, count (*) AS `userCount` FROM ` user ` AS `u`
INNER JOIN `site2user` AS `su` ON s2u.userId = u.id GROUP BY `s2u`.`siteId`) AS `n` ON n.siteId = s.id
* This source code was highlighted with Source Code Highlighter .
出来上がり! まったく正しいリクエストが収集されました。
これは非常に重要な機能です。 より抽象的なパターンの作成を自由に制御できます。 たとえば、いくつかのデータを返すだけでなく、 Zend_Db_Selectオブジェクトの形式でリクエストを返すメソッドをいくつか作成します。 次に、これらのクエリを変更し、他のクエリに埋め込むことができます。 同じSQLコードを異なる場所に記述しないようにしてください。これは、コードのサポートと変更に大きなプラスになります。
PSこの機能は長い間機能しており、APIを受け取るマニュアルであるPHPDocにまだ含まれていない理由は、正直なところまったくわかりません。