CakePHPでサブクエリ(副問い合わせ)を使う

CakePHP1.3公式ドキュメント 「複雑な find の条件」項目の「サブクエリ(Sub-queries)」に詳細あり
https://book.cakephp.org/1.3/ja/The-Manual/Developing-with-CakePHP/Models.html#id10

CakePHP1.3公式ドキュメント 英語版だと「Complex Find Conditions」項目の「Sub-queries」に詳細あり
https://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html#complex-find-conditions
※英語版のほうがもう少し詳細が記載されていました

以下、CakePHP公式ドキュメントの引用(2012/03/06時点)

サブクエリ(Sub-queries)
例えば、Usersテーブルに、id, name, statusカラムがあるとします。 ステータスの値は、A, B, Cのいずれかです。 この前提で、ステータスがB以外のユーザを、サブクエリを使って取得する例を挙げます。
サブクエリを使うには、モデルのDatasourceオブジェクトを取得し、クエリを組み立てます(DatasourceのbuildStatement()メソッドを利用して)。この返値は、SQL文がそのまま入ります。そのSQL文を使ってfindメソッドの条件(conditions)を組み立てます。
  1. $conditionsSubQuery['`User2`.`status`'] = 'B';
  2. $dbo = $this->User->getDataSource(); //Datasourceオブジェクトを取得
  3. $subQuery = $dbo->buildStatement(
  4. array(
  5. 'fields' => array('`User2`.`id`'),
  6. 'table' => $dbo->fullTableName($this->User),
  7. 'alias' => 'User2',
  8. 'limit' => null,
  9. 'offset' => null,
  10. 'joins' => array(),
  11. 'conditions' => $conditionsSubQuery,
  12. 'order' => null,
  13. 'group' => null
  14. ),
  15. $this->User
  16. );
  17. $subQuery = ' `User`.`id` NOT IN (' . $subQuery . ') ';
  18. $subQueryExpression = $dbo->expression($subQuery);
  19. $conditions[] = $subQueryExpression;
  20. $this->User->find('all', compact('conditions'));
上記の条件を用いてfindメソッドを呼び出すと、下記のSQL文が発行されます
  1. SELECT
  2. `User`.`id` ,
  3. `User`.`name` ,
  4. `User`.`status`
  5. FROM
  6. `users` AS `User`
  7. WHERE
  8. `User`.`id` NOT IN (
  9. SELECT
  10. `User2`.`id`
  11. FROM
  12. `users` AS `User2`
  13. WHERE
  14. `User2`.`status` = 'B'
  15. )
もし、SQLの条件式を直接記述したい場合は、Datasourceのexpression()メソッドを利用すれば、それをそのままfindメソッドの条件配列に渡すことができます。

One Reply to “CakePHPでサブクエリ(副問い合わせ)を使う”

Comments are closed.