概要
FuelPHPにおける、クエリビルダで名前付きサブクエリを結合する方法を記載します。
以下のSQLの構築を例に説明します。(SQLの内容がイマイチですが不問とします)
select
*
from
user
inner join (
select
*
from
branch_user
where
branch_name = '関東'
) branch_table on user.id = branch_table.id -- サブクエリにbranch_tableという名前を付与
テーブルは以下を用意します。
userテーブル
id | name | area |
---|---|---|
1 | 田中太郎 | 関東 |
2 | 山田花子 | 関東 |
3 | 山田五郎 | 北海道 |
4 | 高橋玉子 | 東北 |
5 | 伊藤はな | 九州 |
6 | 里中さとる | 九州 |
branch_userテーブル
id | name | area |
---|---|---|
1 | 田中太郎 | 関西 |
2 | 藤倉宗則 | 関東 |
3 | 青木隼也 | 関東 |
4 | 高橋玉子 | 関東 |
5 | 伊藤はな | 関東 |
6 | 里中さとる | 関東 |
7 | 安奈真優 | 関東 |
コード
$sub_query = DB::select()->from('user')->where('area', '=', '関東')->compile();
$query = DB::select()->from('user')
->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')
->on('user.id', '=', 'branch_table.id')
->compile();
Debug::dump($sub_query,$query);
解説
1行目の$sub_queryに、サブクエリのSQLを設定しています。
2行目〜5行目は、実行するSQLの構築処理になります。
3行目の以下の処理で名前付きサブクエリを内部結合しています。
->join(array(DB::expr($sub_query), 'branch_table'), 'INNER')
join()の第一引数に結合するテーブル(今回はサブクエリ)、名前を配列で指定しています。ここで重要なのは、サブクエリの指定にDB::expr()を使用することです。これを使わないとエスケープ処理が正しく行われません。
実行結果
補足
なおOracleを使用している場合は、coreファイルをオーバーライドする必要があります。
オーバーライドの方法については割愛します。
core/classes/database/query/builder/join.php@compile
// Add the alias if needed
if ($this->_alias)
{
$sql .= ' AS '.$db->quote_table($this->_alias);
}