Zend_Db_Selectを使用したサブクエリ

比較的最近、別のモデルのコードを記述するときに、サブクエリ(たとえば、 join )を使用するタスクに直面しました。 同時に、「生の」クエリをできる限り少なくしようと、できる限り少なくしようとしています。 これにはZend Frameworkラッパーを使用します。 しかし、 API マニュアルを見て、驚いたことに、必要な資金が見つかりませんでした。 しかし、コードに直接アクセスした後、サブクエリを非常に簡単に実行できることが明らかになりました!



_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にまだ含まれていない理由は、正直なところまったくわかりません。



All Articles