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)を組み立てます。
- $conditionsSubQuery['`User2`.`status`'] = 'B';
- $dbo = $this->User->getDataSource(); //Datasourceオブジェクトを取得
- $subQuery = $dbo->buildStatement(
- array(
- 'fields' => array('`User2`.`id`'),
- 'table' => $dbo->fullTableName($this->User),
- 'alias' => 'User2',
- 'limit' => null,
- 'offset' => null,
- 'joins' => array(),
- 'conditions' => $conditionsSubQuery,
- 'order' => null,
- 'group' => null
- ),
- $this->User
- );
- $subQuery = ' `User`.`id` NOT IN (' . $subQuery . ') ';
- $subQueryExpression = $dbo->expression($subQuery);
- $conditions[] = $subQueryExpression;
- $this->User->find('all', compact('conditions'));
上記の条件を用いてfindメソッドを呼び出すと、下記のSQL文が発行されます
- SELECT
- `User`.`id` ,
- `User`.`name` ,
- `User`.`status`
- FROM
- `users` AS `User`
- WHERE
- `User`.`id` NOT IN (
- SELECT
- `User2`.`id`
- FROM
- `users` AS `User2`
- WHERE
- `User2`.`status` = 'B'
- )
もし、SQLの条件式を直接記述したい場合は、Datasourceのexpression()メソッドを利用すれば、それをそのままfindメソッドの条件配列に渡すことができます。
めっちゃ役に立ちました
ありがとうございます